Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Migrasikan fungsionalitas Oracle ROWID ke PostgreSQL di AWS
Rakesh Raghav dan Ramesh Pathuri, Amazon Web Services
Ringkasan
Pola ini menjelaskan opsi untuk memigrasikan fungsionalitas ROWID pseudocolumn di Oracle Database ke database PostgreSQL di Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL, Amazon Aurora PostgreSQL Compatible Edition, atau Amazon Elastic Compute Cloud (Amazon). EC2
Dalam database Oracle, ROWID pseudocolumn adalah alamat fisik dari baris dalam tabel. Pseudocolumn ini digunakan untuk mengidentifikasi baris secara unik bahkan jika kunci utama tidak ada di atas meja. PostgreSQL memiliki pseudocolumn serupa yang ctid disebut, tetapi tidak dapat digunakan sebagai. ROWID Seperti yang dijelaskan dalam dokumentasi PostgreSQLctid, mungkin berubah jika diperbarui atau setelah setiap proses. VACUUM
Ada tiga cara Anda dapat membuat fungsionalitas ROWID pseudocolumn di PostgreSQL:
Gunakan kolom kunci primer bukan
ROWIDuntuk mengidentifikasi baris dalam tabel.Gunakan primary/unique kunci logis (yang mungkin merupakan kunci komposit) dalam tabel.
Tambahkan kolom dengan nilai yang dihasilkan secara otomatis dan jadikan itu primary/unique kunci untuk meniru
ROWID.
Pola ini memandu Anda melalui ketiga implementasi dan menjelaskan kelebihan dan kekurangan dari setiap opsi.
Prasyarat dan batasan
Prasyarat
Akun AWS yang aktif
Keahlian pengkodean prosedural Language/PostgreSQL (PL/PGSQL)
Sumber Database Oracle
Kluster Amazon RDS for PostgreSQL atau Aurora PostgreSQL yang kompatibel, atau instance untuk meng-host database PostgreSQL EC2
Batasan
Pola ini menyediakan solusi untuk fungsionalitas tersebut.
ROWIDPostgreSQL tidak menyediakan yang setara dengan di Oracle Database.ROWID
Versi produk
PostgreSQL 11.9 atau yang lebih baru
Arsitektur
Tumpukan teknologi sumber
Oracle Database
Tumpukan teknologi target
Kompatibel dengan Aurora PostgreSQL, Amazon RDS for PostgreSQL, atau instance dengan database PostgreSQL EC2

Opsi implementasi
Ada tiga opsi untuk mengatasi kurangnya ROWID dukungan di PostgreSQL, tergantung pada apakah tabel Anda memiliki kunci primer atau indeks unik, kunci primer logis, atau atribut identitas. Pilihan Anda bergantung pada jadwal proyek Anda, fase migrasi Anda saat ini, dan dependensi pada aplikasi dan kode database.
Opsi | Deskripsi | Keuntungan | Kekurangan |
|---|---|---|---|
Kunci primer atau indeks unik | Jika tabel Oracle Anda memiliki kunci utama, Anda dapat menggunakan atribut kunci ini untuk mengidentifikasi baris secara unik. |
|
|
primary/unique Kunci logis | Jika tabel Oracle Anda memiliki kunci primer logis, Anda dapat menggunakan atribut kunci ini untuk mengidentifikasi baris secara unik. Kunci primer logis terdiri dari atribut atau sekumpulan atribut yang secara unik dapat mengidentifikasi baris, tetapi tidak diberlakukan pada database melalui kendala. |
|
|
Atribut identitas | jika tabel Oracle Anda tidak memiliki kunci utama, Anda dapat membuat bidang tambahan sebagai |
|
|
Alat
Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL membantu Anda mengatur, mengoperasikan, dan menskalakan database relasional PostgreSQL di AWS Cloud.
Amazon Aurora PostgreSQL Compatible Edition adalah mesin database relasional yang dikelola sepenuhnya dan sesuai dengan ACID yang membantu Anda mengatur, mengoperasikan, dan menskalakan penerapan PostgreSQL.
AWS Command Line Interface (AWS CLI) adalah alat sumber terbuka yang membantu Anda berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda. Dalam pola ini, Anda dapat menggunakan AWS CLI untuk menjalankan perintah SQL melalui pgAdmin.
pgAdmin
adalah alat manajemen sumber terbuka untuk PostgreSQL. Ini menyediakan antarmuka grafis yang membantu Anda membuat, memelihara, dan menggunakan objek database. AWS Schema Conversion Tool (AWS SCT) mendukung migrasi database heterogen dengan secara otomatis mengonversi skema basis data sumber dan sebagian besar kode kustom ke format yang kompatibel dengan database target.
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Identifikasi tabel Oracle yang menggunakan | Gunakan AWS Schema Conversion Tool (AWS SCT) untuk mengidentifikasi tabel Oracle yang memiliki fungsionalitas. — atau — Di Oracle, gunakan | DBA atau pengembang |
Identifikasi kode yang mereferensikan tabel ini. | Gunakan AWS SCT untuk membuat laporan penilaian migrasi guna mengidentifikasi prosedur yang terpengaruh — atau — Dalam database sumber Oracle, gunakan bidang teks | DBA atau pengembang |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Identifikasi tabel yang tidak memiliki kunci utama. | Dalam database sumber Oracle, gunakan
| DBA atau pengembang |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Terapkan perubahan untuk tabel yang memiliki kunci primer yang ditentukan atau logis. | Buat perubahan kode aplikasi dan database yang ditampilkan di bagian Informasi tambahan untuk menggunakan kunci primer unik atau kunci primer logis untuk mengidentifikasi baris dalam tabel Anda. | DBA atau pengembang |
Tambahkan bidang tambahan ke tabel yang tidak memiliki kunci primer yang ditentukan atau logis. | Tambahkan atribut tipe | DBA atau pengembang |
Tambahkan indeks jika perlu. | Tambahkan indeks ke bidang tambahan atau kunci primer logis untuk meningkatkan kinerja SQL. | DBA atau pengembang |
Sumber daya terkait
Kolom yang dihasilkan
(dokumentasi PostgreSQL)
Informasi tambahan
Bagian berikut memberikan contoh kode Oracle dan PostgreSQL untuk menggambarkan tiga pendekatan.
Skenario 1: Menggunakan kunci unik primer
Dalam contoh berikut, Anda membuat tabel testrowid_s1 dengan emp_id sebagai kunci utama.
Kode 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
Kode 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
Skenario 2: Menggunakan kunci primer logis
Dalam contoh berikut, Anda membuat tabel testrowid_s2 dengan emp_id sebagai kunci utama logis.
Kode 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
Kode 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
Skenario 3: Menggunakan atribut identitas
Dalam contoh berikut, Anda membuat tabel testrowid_s3 tanpa kunci utama dan dengan menggunakan atribut identitas.
Kode 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
Kode 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