

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Migrasikan kolom virtual yang dihasilkan dari Oracle ke PostgreSQL
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

*Veeranjaneyulu Grandhi, Rajesh Madiwale, dan Ramesh Pathuri, Amazon Web Services*

## Ringkasan
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-summary"></a>

Di versi 11 dan sebelumnya, PostgreSQL tidak menyediakan fitur yang secara langsung setara dengan kolom virtual Oracle. Menangani kolom virtual yang dihasilkan saat bermigrasi dari Oracle Database ke PostgreSQL versi 11 atau sebelumnya sulit karena dua alasan: 
+ Kolom virtual tidak terlihat selama migrasi.
+ PostgreSQL tidak mendukung `generate` ekspresi sebelum versi 12.

Namun, ada solusi untuk meniru fungsionalitas serupa. Bila Anda menggunakan AWS Database Migration Service (AWS DMS) untuk memigrasikan data dari Oracle Database ke PostgreSQL versi 11 dan yang lebih lama, Anda dapat menggunakan fungsi pemicu untuk mengisi nilai dalam kolom virtual yang dihasilkan. Pola ini memberikan contoh Oracle Database dan kode PostgreSQL yang dapat Anda gunakan untuk tujuan ini. Di AWS, Anda dapat menggunakan Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL atau Amazon Aurora PostgreSQL Edisi yang kompatibel dengan PostgreSQL untuk database PostgreSQL Anda.

Dimulai dengan PostgreSQL versi 12, kolom yang dihasilkan didukung. Kolom yang dihasilkan dapat dihitung dari nilai kolom lain dengan cepat, atau dihitung dan disimpan. [Kolom yang dihasilkan PostgreSQL mirip dengan kolom virtual](https://www.postgresql.org/docs/12/ddl-generated-columns.html) Oracle.

## Prasyarat dan batasan
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif
+ Database Oracle sumber 
+ Target database PostgreSQL (di Amazon RDS untuk PostgreSQL atau Aurora PostgreSQL yang kompatibel dengan Aurora)
+ [Keahlian pengkodean PL/PGSQL](https://www.postgresql.org/docs/current/plpgsql.html)

**Batasan**
+ Berlaku hanya untuk versi PostgreSQL sebelum versi 12. 
+ Berlaku untuk Oracle Database versi 11g atau yang lebih baru.
+ Kolom virtual tidak didukung dalam alat migrasi data.
+ Berlaku hanya untuk kolom yang didefinisikan dalam tabel yang sama.
+ Jika kolom yang dihasilkan virtual mengacu pada fungsi deterministik yang ditentukan pengguna, itu tidak dapat digunakan sebagai kolom kunci partisi.
+ Output dari ekspresi harus berupa nilai skalar. Itu tidak dapat mengembalikan tipe data yang disediakan Oracle, tipe yang ditentukan pengguna, atau. `LOB` `LONG RAW`
+ Indeks yang didefinisikan terhadap kolom virtual setara dengan indeks berbasis fungsi di PostgreSQL.
+ Statistik tabel harus dikumpulkan.

## Alat
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ [pgAdmin](https://www.pgadmin.org/) 4 adalah alat manajemen open source untuk PostgreSQL. Alat ini menyediakan antarmuka grafis yang menyederhanakan pembuatan, pemeliharaan, dan penggunaan objek database.
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) adalah lingkungan pengembangan terintegrasi gratis untuk bekerja dengan SQL di database Oracle baik dalam penerapan tradisional maupun cloud. 

## Epik
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-epics"></a>

### Buat tabel basis data sumber dan target
<a name="create-source-and-target-database-tables"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat tabel Database Oracle sumber. | Di Oracle Database, buat tabel dengan kolom virtual yang dihasilkan dengan menggunakan pernyataan berikut.<pre>CREATE TABLE test.generated_column<br />( CODE NUMBER,<br />STATUS VARCHAR2(12) DEFAULT 'PreOpen',<br />FLAG CHAR(1) GENERATED ALWAYS AS (CASE UPPER(STATUS) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) VIRTUAL VISIBLE<br />);</pre><br />Dalam tabel sumber ini, data di `STATUS` kolom dimigrasikan melalui AWS DMS ke database target. `FLAG`Kolom, bagaimanapun, diisi dengan menggunakan `generate by` fungsionalitas, sehingga kolom ini tidak terlihat oleh AWS DMS selama migrasi. Untuk mengimplementasikan fungsionalitas`generated by`, Anda harus menggunakan pemicu dan fungsi dalam database target untuk mengisi nilai di `FLAG` kolom, seperti yang ditunjukkan dalam epik berikutnya. | DBA, Pengembang aplikasi | 
| Buat tabel PostgreSQL target di AWS. | Buat tabel PostgreSQL di AWS dengan menggunakan pernyataan berikut.<pre>CREATE TABLE test.generated_column<br />(<br />    code integer not null,<br />    status character varying(12) not null ,<br />    flag character(1)<br />);</pre><br />Dalam tabel ini, `status` kolom adalah kolom standar. `flag`Kolom akan menjadi kolom yang dihasilkan berdasarkan data di `status` kolom. | DBA, Pengembang aplikasi | 

### Buat fungsi pemicu untuk menangani kolom virtual di PostgreSQL
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat pemicu PostgreSQL. | Di PostgreSQL, buat pemicu.<pre>CREATE TRIGGER tgr_gen_column<br />AFTER INSERT OR UPDATE OF status ON test.generated_column<br />FOR EACH ROW <br />EXECUTE FUNCTION test.tgf_gen_column();</pre> | DBA, Pengembang aplikasi | 
| Buat fungsi pemicu PostgreSQL. | Di PostgreSQL, buat fungsi untuk pemicu. Fungsi ini mengisi kolom virtual yang disisipkan atau diperbarui oleh aplikasi atau AWS DMS, dan memvalidasi data.<pre>CREATE OR REPLACE FUNCTION test.tgf_gen_column() RETURNS trigger AS $VIRTUAL_COL$<br />BEGIN<br />IF (TG_OP = 'INSERT') THEN<br />IF (NEW.flag IS NOT NULL) THEN<br />RAISE EXCEPTION 'ERROR: cannot insert into column "flag"' USING DETAIL = 'Column "flag" is a generated column.';<br />END IF;<br />END IF;<br />IF (TG_OP = 'UPDATE') THEN<br />IF (NEW.flag::VARCHAR != OLD.flag::varchar) THEN<br />RAISE EXCEPTION 'ERROR: cannot update column "flag"' USING DETAIL = 'Column "flag" is a generated column.';<br />END IF;<br />END IF;<br />IF TG_OP IN ('INSERT','UPDATE') THEN<br />IF (old.flag is NULL) OR (coalesce(old.status,'') != coalesce(new.status,'')) THEN<br />UPDATE test.generated_column<br />SET flag = (CASE UPPER(status) WHEN 'OPEN' THEN 'N' ELSE 'Y' END)<br />WHERE code = new.code;<br />END IF;<br />END IF;<br />RETURN NEW;<br />END<br />$VIRTUAL_COL$ LANGUAGE plpgsql;</pre> | DBA, Pengembang aplikasi | 

### Uji migrasi data dengan menggunakan AWS DMS
<a name="test-data-migration-by-using-aws-dms"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat contoh replikasi. | Untuk membuat instance replikasi, ikuti [petunjuk dalam dokumentasi](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html) AWS DMS. Instans replikasi harus berada di cloud pribadi virtual (VPC) yang sama dengan basis data sumber dan target Anda. | DBA, Pengembang aplikasi | 
| Buat titik akhir sumber dan target. | Untuk membuat titik akhir, ikuti [petunjuk dalam dokumentasi](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html) AWS DMS. | DBA, Pengembang aplikasi | 
| Uji koneksi titik akhir. | **Anda dapat menguji koneksi titik akhir dengan menentukan VPC dan instance replikasi dan memilih Run test.** | DBA, Pengembang aplikasi | 
| Buat dan mulai tugas beban penuh. | Untuk petunjuknya, lihat [Membuat Tugas](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) dan [setelan tugas beban penuh](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html) dalam dokumentasi AWS DMS. | DBA, Pengembang aplikasi | 
| Validasi data untuk kolom virtual. | Bandingkan data di kolom virtual di database sumber dan target. Anda dapat memvalidasi data secara manual atau menulis skrip untuk langkah ini. | DBA, Pengembang aplikasi | 

## Sumber daya terkait
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [Memulai AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (dokumentasi AWS DMS)
+ [Menggunakan database Oracle sebagai sumber AWS DMS (dokumentasi AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html))
+ [Menggunakan database PostgreSQL sebagai target AWS DMS (dokumentasi AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)
+ [Kolom yang dihasilkan di PostgreSQL (dokumentasi PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html))
+ [Fungsi pemicu](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (dokumentasi PostgreSQL)
+ [Kolom virtual](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) di Oracle Database (dokumentasi Oracle)