

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 funcionalidade Oracle ROWID para o PostgreSQL na AWS
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws"></a>

*Rakesh Raghav e Ramesh Pathuri, Amazon Web Services*

## Resumo
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-summary"></a>

Esse padrão descreve as opções para migrar a funcionalidade de `ROWID` pseudocoluna no Oracle Database para um banco de dados PostgreSQL no Amazon Relational Database Service (Amazon RDS) para PostgreSQL, Amazon Aurora PostgreSQL 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 PostgreSQL tem uma pseudocoluna similar chamada `ctid`, mas ela não pode ser usada como a `ROWID`. Conforme explicado na documentação do [PostgreSQL](https://www.postgresql.org/docs/current/ddl-system-columns.html), `ctid` pode mudar se for atualizado ou após cada processo `VACUUM`.

Há três maneiras de criar a funcionalidade de pseudocoluna `ROWID` no PostgreSQL:
+ Use uma coluna de chave primária em vez de `ROWID` para identificar uma linha em uma tabela.
+ Use uma primary/unique chave lógica (que pode ser uma chave composta) na tabela. 
+ Adicione uma coluna com valores gerados automaticamente e torne-a uma primary/unique chave para `ROWID` imitar.

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
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-prereqs"></a>

**Pré-requisitos **
+ Uma conta AWS ativa
+ Experiência em codificação processual Language/PostgreSQL (PL/pgSQL)
+ Origem: banco de dados Oracle
+ Um cluster compatível com o Amazon RDS for PostgreSQL ou Aurora PostgreSQL, ou uma instância para hospedar o banco de dados PostgreSQL EC2 

**Limitações**
+ Esse padrão fornece soluções alternativas para a funcionalidade `ROWID`. O PostgreSQL não fornece um equivalente a `ROWID` do Oracle Database.

**Versões do produto**
+ PostgreSQL 11.9 ou superior

## Arquitetura
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-architecture"></a>

**Pilha de tecnologia de origem**
+ Oracle Database

**Pilha de tecnologias de destino**
+ Compatível com Aurora PostgreSQL, Amazon RDS for PostgreSQL ou uma instância com um banco de dados PostgreSQL EC2 

![Conversão de um banco de dados Oracle em PostgreSQL na AWS](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9a2ce994-4f68-4975-aab2-796cc20a3c82/images/6e7c2ef6-f440-476a-9003-f1f166718e15.png)


**Opções de implementação**

Há três opções para contornar a falta de suporte de `ROWID` 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 | Description | 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.  | Sem dependência de atributos de banco de dados proprietários.Impacto mínimo no desempenho, pois os campos da chave primária são indexados. | Requer alterações no código do aplicativo e do banco de dados que depende da mudança `ROWID` para campos de chave primária.  | 
| ** primary/unique Chave lógica** | 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. | Sem dependência de atributos de banco de dados proprietários. | Requer alterações no código do aplicativo e do banco de dados que depende da mudança `ROWID` para campos de chave primária.Impacto significativo no desempenho se os atributos da chave primária lógica não forem indexados. No entanto, você pode adicionar um índice exclusivo para evitar problemas de desempenho. | 
| **Atributo de identidade** | se sua tabela Oracle não tiver uma chave primária, você poderá criar um campo adicional como `GENERATED ALWAYS AS IDENTITY`. Esse atributo gera um valor exclusivo sempre que os dados são inseridos na tabela, portanto, ele pode ser usado para identificar de forma exclusiva uma linha para operações de linguagem de manipulação de dados (DML). | Sem dependência de atributos de banco de dados proprietários.O banco de dados PostgreSQL preenche o atributo e mantém sua exclusividade. | Requer alterações no código do aplicativo e do banco de dados que depende de `ROWID` para mudar para o atributo de identidade.Impacto significativo no desempenho se o campo adicional não estiver indexado. No entanto, você pode adicionar um índice para evitar problemas de desempenho. | 

## Ferramentas
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-tools"></a>
+ [O Amazon Relational Database Service (Amazon RDS) para PostgreSQL ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html)ajuda você a configurar, operar e escalar um banco de dados relacional PostgreSQL na Nuvem AWS.
+ O [Amazon Aurora Edição Compatível com PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) é um mecanismo de banco de dados relacional totalmente gerenciado e em conformidade com ACID que ajuda você a configurar, operar e escalar as implantações de PostgreSQL.
+ A ‭[AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)‭ é uma ferramenta de código aberto que permite que você interaja com serviços da AWS usando comandos no shell da linha de comando. Nesse padrão, você pode usar a AWS CLI para executar comandos SQL por meio do **pGADmin**.
+ O [pgAdmin](https://www.pgadmin.org/) é uma ferramenta de gerenciamento de código aberto para PostgreSQL. Ele fornece uma interface gráfica que ajuda você a criar, manter e usar objetos de banco de dados.
+ O [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html) oferece suporte a 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
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-epics"></a>

### Identificar as tabelas de fontes
<a name="identify-the-source-tables"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Identifique as tabelas da Oracle que usam o atributo `ROWID`. | Use a AWS Schema Conversion Tool (AWS SCT) para identificar tabelas Oracle que tenham a funcionalidade `ROWID`. Para obter mais informações, consulte a [documentação da AWS SCT](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.Oracle.ToPostgreSQL.html#CHAP_Source.Oracle.ToPostgreSQL.ConvertRowID).<br />—ou—<br />No Oracle, use a visualização `DBA_TAB_COLUMNS` para identificar tabelas que tenham um atributo `ROWID`. Esses campos podem ser usados para armazenar caracteres alfanuméricos de 10 bytes. Determine o uso e converta-os em um campo `VARCHAR`, se for apropriado. | DBA ou desenvolvedor | 
| Identifique o código que faz referência a essas tabelas. | Use o AWS SCT para gerar um relatório de avaliação de migração para identificar procedimentos afetados por `ROWID`. Para obter mais informações, consulte a [documentação da AWS SCT](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_AssessmentReport.html).<br />—ou—<br />No banco de dados Oracle de origem, use o campo de texto da tabela `dba_source` para identificar objetos que usam a funcionalidade `ROWID`. | DBA ou desenvolvedor | 

### Determine o uso de chaves primárias
<a name="determine-primary-key-usage"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Identifique tabelas que não têm chaves primárias. | No banco de dados Oracle de origem, use `DBA_CONSTRAINTS` para identificar tabelas que não têm chaves primárias. Essas informações ajudarão você a determinar a estratégia para cada tabela. Por exemplo:<pre>select dt.*<br />from dba_tables dt<br />where not exists (select 1<br />                  from all_constraints ct<br />                  where ct.owner = Dt.owner<br />                    and ct.table_name = Dt.table_name<br />                    and ct.constraint_type = 'P'<br />                  )<br />and dt.owner = '{schema}'</pre> | DBA ou desenvolvedor | 

### Identifique e aplique a solução
<a name="identify-and-apply-the-solution"></a>


| Tarefa | Description | 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](#migrate-oracle-rowid-functionality-to-postgresql-on-aws-additional) para usar uma chave primária exclusiva ou uma chave primária lógica para identificar uma linha na tabela. | DBA ou desenvolvedor | 
| Inclua um campo adicional às tabelas que não tenham uma chave primária lógica ou definida. | Adicione um atributo do tipo `GENERATED ALWAYS AS IDENTITY`. Faça as alterações no código do aplicativo e do banco de dados mostradas na seção de [Informações adicionais](#migrate-oracle-rowid-functionality-to-postgresql-on-aws-additional). | DBA ou desenvolvedor | 
| Adicione um índice, se necessário. | Inclua um índice ao campo adicional ou à chave primária lógica para melhorar o desempenho do SQL. | DBA ou desenvolvedor | 

## Recursos relacionados
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-resources"></a>
+ [PostgreSQL CTID](https://www.postgresql.org/docs/current/ddl-system-columns.html) (Documentação do PostgreSQL)
+ [Colunas geradas](https://www.postgresql.org/docs/current/ddl-generated-columns.html) (Documentação do PostgreSQL)
+ [Pseudocoluna ROWID](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ROWID-Pseudocolumn.html#GUID-F6E0FBD2-983C-495D-9856-5E113A17FAF1) (Documentação da Oracle)

## Mais informações
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-additional"></a>

As seções a seguir fornecem códigos de exemplos Oracle e PostgreSQL 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
```

*Código PostgreSQL:*

```
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
```

*Código PostgreSQL:*

```
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
```

*Código PostgreSQL:*

```
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
```