As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Migre a ROWID funcionalidade Oracle para o SQL Postgre em AWS
Criado por Rakesh Raghav (AWS) e Ramesh Pathuri () AWS
Ambiente: PoC ou piloto | Origem: banco de dados Oracle | Alvo: SQL banco de dados Postgre em AWS |
Tipo R: redefinir a plataforma | Workload: Oracle | Tecnologias: migração; bancos de dados |
AWSserviços: Amazon Aurora; AmazonRDS; AWS SCT AWS CLI |
Resumo
Esse padrão descreve as opções para migrar a funcionalidade de ROWID
pseudocoluna no Oracle Database para um banco de dados Postgre no Amazon Relational SQL Database Service (Amazon) for PostgreSQL, RDS Amazon Aurora SQL Postgre -Compatible Edition ou Amazon Elastic Compute Cloud (Amazon). EC2
Em um banco de dados Oracle, a pseudocoluna ROWID
é o endereço físico de uma linha em uma tabela. Essa pseudocoluna é usada para identificar de forma exclusiva uma linha, mesmo que a chave primária não esteja presente em uma tabela. O Postgre SQL tem uma pseudocoluna semelhante chamadactid
, mas ela não pode ser usada como a. ROWID
Conforme explicado na SQLdocumentação do Postgrectid
pode mudar se for atualizado ou após cada VACUUM
processo.
Há três maneiras de criar a funcionalidade de ROWID
pseudocoluna no Postgre: SQL
Use uma coluna de chave primária em vez de
ROWID
para identificar uma linha em uma tabela.Use uma chave lógica primária/exclusiva (que pode ser uma chave composta) na tabela.
Adicione uma coluna com valores gerados automaticamente e torne-a uma chave primária/exclusiva para imitar
ROWID
.
Esse padrão mostra todas as três implementações e descreve as vantagens e desvantagens de cada opção.
Pré-requisitos e limitações
Pré-requisitos
Uma AWS conta ativa
Experiência em codificação em linguagem processual/Postgre (PL/PgSQL) SQL
Origem: banco de dados Oracle
Um cluster compatível com Amazon RDS for Postgre SQL ou Aurora SQL Postgre, ou EC2 uma instância para hospedar o banco de dados Postgre SQL
Limitações
Esse padrão fornece soluções alternativas para a funcionalidade
ROWID
. O Postgre SQL não fornece um equivalente aoROWID
do Oracle Database.
Versões do produto
Postger SQL 11.9 ou posterior
Arquitetura
Pilha de tecnologia de origem
Oracle Database
Pilha de tecnologias de destino
SQLCompatível com Aurora Postgre, RDS Amazon for SQL Postgre ou EC2 uma instância com um banco de dados Postgre SQL
Opções de implementação
Há três opções para contornar a falta de ROWID
suporte no PostgreSQL, dependendo se sua tabela tem uma chave primária ou um índice exclusivo, uma chave primária lógica ou um atributo de identidade. Sua escolha depende dos cronogramas do projeto, da fase atual de migração e das dependências do código do aplicativo e do banco de dados.
Opção | Descrição | Vantagens | Desvantagens |
Chave primária ou índice exclusivo | Se sua tabela Oracle tiver uma chave primária, você poderá usar os atributos dessa chave para identificar uma linha de forma exclusiva. |
|
|
Chave lógica primária/exclusiva | Se sua tabela Oracle tiver uma chave primária, lógica, você poderá usar os atributos dessa chave para identificar uma linha de forma exclusiva. Uma chave primária lógica consiste em um atributo ou conjunto de atributos que pode identificar uma linha de forma exclusiva, mas não é aplicada ao banco de dados por meio de uma restrição. |
|
|
Atributo de identidade | se sua tabela Oracle não tiver uma chave primária, você poderá criar um campo adicional como |
|
|
Ferramentas
O Amazon Relational Database Service (RDSAmazon) para SQL Postgre ajuda você a configurar, operar e escalar um banco de dados relacional SQL Postgre na nuvem. AWS
O Amazon Aurora Postgre SQL -Compatible Edition é um mecanismo de banco de dados relacional totalmente gerenciado e ACID compatível que ajuda você a configurar, operar e escalar implantações do Postgre. SQL
AWSA interface de linha de comando (AWSCLI) é uma ferramenta de código aberto que ajuda você a interagir com AWS serviços por meio de comandos em seu shell de linha de comando. Nesse padrão, você pode usar o AWS CLI para executar SQL comandos pgAdmin.
pgAdmin
é uma ferramenta de gerenciamento de código aberto para o Postgre. SQL Ele fornece uma interface gráfica que ajuda você a criar, manter e usar objetos de banco de dados. AWSA Schema Conversion Tool AWS SCT () suporta migrações heterogêneas de bancos de dados convertendo automaticamente o esquema do banco de dados de origem e a maior parte do código personalizado em um formato compatível com o banco de dados de destino.
Épicos
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Identifique as tabelas Oracle que usam o | Use a AWS Schema Conversion Tool AWS SCT () para identificar tabelas Oracle que —ou— No Oracle, use a visualização | DBAou desenvolvedor |
Identifique o código que faz referência a essas tabelas. | Use AWS SCT para gerar um relatório de avaliação de migração para identificar os procedimentos afetados pelo —ou— No banco de dados Oracle de origem, use o campo de texto da tabela | DBAou desenvolvedor |
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Identifique tabelas que não têm chaves primárias. | No banco de dados Oracle de origem, use
| DBAou desenvolvedor |
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Aplique alterações em tabelas que tenham uma chave primária lógica ou definida. | Faça as alterações no código do aplicativo e do banco de dados mostradas na seção Informações adicionais para usar uma chave primária exclusiva ou uma chave primária lógica para identificar uma linha na tabela. | DBAou desenvolvedor |
Inclua um campo adicional às tabelas que não tenham uma chave primária lógica ou definida. | Adicione um atributo do tipo | DBAou desenvolvedor |
Adicione um índice, se necessário. | Adicione um índice ao campo adicional ou à chave primária lógica para melhorar o SQL desempenho. | DBAou desenvolvedor |
Recursos relacionados
Postger SQL CTID (documentação
do PostgreSQL) Colunas geradas
(SQLdocumentação do Postgre)
Mais informações
As seções a seguir fornecem exemplos de SQL códigos Oracle e Postgre para ilustrar as três abordagens.
Cenário 1: usar uma chave primária exclusiva
Nos exemplos a seguir, você cria a tabela testrowid_s1
com emp_id
como a chave primária.
Código Oracle:
create table testrowid_s1 (emp_id integer, name varchar2(10), CONSTRAINT testrowid_pk PRIMARY KEY (emp_id)); INSERT INTO testrowid_s1(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s1(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s1(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s1(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 empname2 AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4 UPDATE testrowid_s1 SET name = 'Ramesh' WHERE rowid = 'AAAF3pAAAAAAAMOAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 Ramesh AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4
SQLCódigo postal:
CREATE TABLE public.testrowid_s1 ( emp_id integer, name character varying, primary key (emp_id) ); insert into public.testrowid_s1 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s1 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh
Cenário 2: usar uma chave primária lógica
Nos exemplos a seguir, você cria a tabela testrowid_s2
com emp_id
a chave primária.
Código Oracle:
create table testrowid_s2 (emp_id integer, name varchar2(10) ); INSERT INTO testrowid_s2(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s2(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s2(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s2(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 empname2 AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4 UPDATE testrowid_s2 SET name = 'Ramesh' WHERE rowid = 'AAAF3rAAAAAAAMeAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 Ramesh AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4
SQLCódigo postal:
CREATE TABLE public.testrowid_s2 ( emp_id integer, name character varying ); insert into public.testrowid_s2 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s2 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh
Cenário 3: usar um atributo de identidade
Nos exemplos a seguir, você cria a tabela testrowid_s3
sem chave primária e usando um atributo de identidade.
Código Oracle:
create table testrowid_s3 (name varchar2(10)); INSERT INTO testrowid_s3(name) values ('empname1'); INSERT INTO testrowid_s3(name) values ('empname2'); INSERT INTO testrowid_s3(name) values ('empname3'); INSERT INTO testrowid_s3(name) values ('empname4'); commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB empname2 AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4 UPDATE testrowid_s3 SET name = 'Ramesh' WHERE rowid = 'AAAF3sAAAAAAAMmAAB' ; commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB Ramesh AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4
SQLCódigo postal:
CREATE TABLE public.testrowid_s3 ( rowid_seq bigint generated always as identity, name character varying ); insert into public.testrowid_s3 (name) values ('empname1'),('empname2'),('empname3'),('empname4'); select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s3 set name = 'Ramesh' where rowid_seq = 2 ; select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh