Migrar tabelas sem chaves primárias

Nesta página, explicamos como migrar tabelas do Oracle que não têm chaves primárias.

Visão geral da geração automática de chave primária

Tabelas sem chaves primárias não garantem uma replicação consistente. O Database Migration Service só migra tabelas que têm chaves primárias. Se o banco de dados de origem incluir tabelas sem chaves primárias, o Database Migration Service poderá lidar com isso das seguintes maneiras:

  • Quando você converte o código-fonte e o esquema, o Database Migration Service pode criar automaticamente as chaves primárias ausentes adicionando colunas ROWID nas tabelas de destino. Esse processo automatizado exige que as tabelas de origem:
    • Não têm chaves primárias.
    • Não use uma restrição UNIQUE sem colunas anuláveis.
    • Não tenha um índice UNIQUE sem colunas anuláveis.
    Se as tabelas não atenderem a esses requisitos, será necessário adicionar manualmente as chaves primárias ausentes às tabelas no esquema PostgreSQL convertido.
  • Em espaços de trabalho de conversão legados, o Database Migration Service não cria chaves primárias automaticamente. Se você usa um espaço de trabalho de conversão legado, precisa adicionar manualmente as chaves primárias ausentes às tabelas no esquema do PostgreSQL convertido.

Adicionar chaves primárias ausentes manualmente

Para migrar tabelas do Oracle sem chaves primárias, faça o seguinte:

  1. Use um espaço de trabalho de conversão para converter o código-fonte e o esquema.
  2. Conecte-se à instância de destino do Cloud SQL com um cliente SQL. Você pode usar os seguintes métodos:
    • psql cliente. É possível usar esse método para se conectar ao IP privado da instância, mas talvez seja necessário criar uma máquina virtual do Compute Engine.
    • Comando gcloud sql connect. Esse comando funciona apenas para instâncias do Cloud SQL que têm um endereço IP público ativado.
  3. Crie as restrições de chave primária que estão faltando nas tabelas. Para mais informações sobre chaves primárias, consulte Chaves primárias na documentação do PostgreSQL.

    Você também pode expandir as seções a seguir para ver exemplos de comandos SQL:

    Criar chaves primárias usando colunas atuais

    Sua tabela pode já ter uma chave primária lógica com base em uma coluna ou em uma combinação de colunas. Por exemplo, pode haver colunas com uma restrição ou um índice exclusivo configurado. Use essas colunas para gerar uma nova chave primária para tabelas no banco de dados de origem. Exemplo:

    ALTER TABLE TABLE_NAME
    ADD PRIMARY KEY (COLUMN_NAME);

    Substitua:

    • TABLE_NAME pelo nome da tabela que não tem uma chave primária.
    • COLUMN_NAME pelo nome de uma coluna com restrição ou índice exclusivo que pode ser usado como chave primária.

    Criar uma chave primária usando todas as colunas

    Se você não tiver uma restrição preexistente que possa servir como chave primária, crie chaves primárias usando todas as colunas da tabela. Verifique se você não excede o tamanho máximo da chave primária permitido pela instância do PostgreSQL.

    Ao criar uma chave primária composta dessa forma, é necessário listar explicitamente todos os nomes de coluna que você quer usar. Não é possível usar uma instrução para recuperar todos os nomes de colunas para essa finalidade. Exemplo:

    ALTER TABLE TABLE_NAME
    ADD PRIMARY KEY (COLUMN_NAME_1, COLUMN_NAME_2, COLUMN_NAME_3, ...);

    Substitua:

    • TABLE_NAME pelo nome da tabela que não tem uma chave primária.
    • COLUMN_NAME_1, COLUMN_NAME_2 etc. pelos nomes das colunas que você quer usar para criar a chave primária.

    Criar uma restrição exclusiva com a pseudocoluna ROWID

    Os bancos de dados Oracle usam a pseudocoluna ROWID para armazenar o local de cada linha em uma tabela. Para migrar tabelas do Oracle que não têm chaves primárias, adicione uma coluna ROWID no banco de dados PostgreSQL de destino. O Database Migration Service preenche a coluna com os valores numéricos correspondentes da pseudocoluna ROWID do Oracle de origem.

    Para adicionar a coluna e defini-la como a chave primária, execute o seguinte:

    ALTER TABLE TABLE_NAME ADD COLUMN rowid numeric(33,0) NOT NULL;
    CREATE SEQUENCE TABLE_NAME_rowid_seq INCREMENT BY -1 START WITH -1 OWNED BY TABLE_NAME.rowid;
    ALTER TABLE TABLE_NAME ALTER COLUMN rowid SET DEFAULT nextval('TABLE_NAME_rowid_seq');
    ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_DISPLAY_NAME PRIMARY KEY (rowid);

    Substitua:

    • TABLE_NAME pelo nome da tabela em que você quer adicionar a coluna.
    • CONSTRAINT_DISPLAY_NAME pelo identificador da restrição PRIMARY KEY.

A seguir