

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

# Migrasi dari SQL Server ke PostgreSQL dengan AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToPostgreSQL"></a>

Anda dapat menggunakan SQL Server untuk paket ekstensi PostgreSQL di. AWS SCT Paket ekstensi ini mengemulasi fungsi database SQL Server dalam kode PostgreSQL yang dikonversi. Gunakan paket ekstensi SQL Server ke PostgreSQL untuk meniru SQL Server Agent dan SQL Server Database Mail. Untuk informasi selengkapnya tentang paket ekstensi, lihat[Menggunakan paket ekstensi dengan AWS Schema Conversion Tool](CHAP_ExtensionPack.md). 

**Topics**
+ [Hak istimewa untuk PostgreSQL sebagai database target](#CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL)
+ [SQL Server ke pengaturan konversi PostgreSQL](#CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings)
+ [Mengkonversi partisi SQL Server ke PostgreSQL versi 10 partisi](#CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions)
+ [Pertimbangan migrasi](#CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations)
+ [Menggunakan paket AWS SCT ekstensi untuk meniru SQL Server Agent di PostgreSQL](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.md)
+ [Menggunakan paket AWS SCT ekstensi untuk meniru SQL Server Database Mail di PostgreSQL](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.md)

## Hak istimewa untuk PostgreSQL sebagai database target
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL"></a>

Untuk menggunakan PostgreSQL sebagai target, membutuhkan hak istimewa. AWS SCT `CREATE ON DATABASE` Pastikan Anda memberikan hak istimewa ini untuk setiap database PostgreSQL target.

Untuk menggunakan sinonim publik yang dikonversi, ubah jalur pencarian default database menjadi`"$user", public_synonyms, public`.

Anda dapat menggunakan contoh kode berikut untuk membuat pengguna database dan memberikan hak istimewa.

```
CREATE ROLE {{user_name}} LOGIN PASSWORD '{{your_password}}';
GRANT CREATE ON DATABASE {{db_name}} TO {{user_name}};
ALTER DATABASE {{db_name}} SET SEARCH_PATH = "$user", public_synonyms, public;
```

Pada contoh sebelumnya, ganti {{user\_name}} dengan nama pengguna Anda. Kemudian, ganti {{db\_name}} dengan nama database target Anda. Akhirnya, ganti {{your\_password}} dengan kata sandi yang aman.

Di PostgreSQL, hanya pemilik skema atau a yang dapat menjatuhkan skema. `superuser` Pemilik dapat menjatuhkan skema dan semua objek yang disertakan skema ini bahkan jika pemilik skema tidak memiliki beberapa objeknya.

Saat Anda menggunakan pengguna yang berbeda untuk mengonversi dan menerapkan skema yang berbeda ke basis data target Anda, Anda bisa mendapatkan pesan kesalahan saat tidak AWS SCT dapat menjatuhkan skema. Untuk menghindari pesan kesalahan ini, gunakan `superuser` peran. 

## SQL Server ke pengaturan konversi PostgreSQL
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings"></a>

**Untuk mengedit SQL Server ke pengaturan konversi PostgreSQL, pilih Pengaturan, lalu **pilih** Pengaturan konversi.** Dari daftar atas, pilih **SQL Server, lalu pilih SQL Server** - **PostgreSQL**. AWS SCT menampilkan semua pengaturan yang tersedia untuk konversi SQL Server ke PostgreSQL.

Pengaturan AWS SCT konversi SQL Server ke PostgreSQL di menyertakan opsi untuk hal berikut:
+ Untuk membatasi jumlah komentar dengan item tindakan dalam kode yang dikonversi.

  Untuk **Tambahkan komentar di kode yang dikonversi untuk item tindakan dengan tingkat keparahan yang dipilih dan lebih tinggi**, pilih tingkat keparahan item tindakan. AWS SCT menambahkan komentar dalam kode yang dikonversi untuk item tindakan dengan tingkat keparahan yang dipilih dan lebih tinggi.

  Misalnya, untuk meminimalkan jumlah komentar dalam kode yang dikonversi, pilih **Error only**. Untuk menyertakan komentar untuk semua item tindakan dalam kode yang dikonversi, pilih **Semua pesan**.
+ Untuk memungkinkan untuk menggunakan indeks dengan nama yang sama dalam tabel yang berbeda di SQL Server.

  Di PostgreSQL, semua nama indeks yang Anda gunakan dalam skema, harus unik. Untuk memastikan bahwa AWS SCT menghasilkan nama unik untuk semua indeks Anda, pilih **Hasilkan nama unik untuk indeks**.
+ Untuk mengkonversi prosedur SQL Server ke fungsi PostgreSQL.

  PostgreSQL versi 10 dan sebelumnya tidak mendukung prosedur. Untuk pelanggan yang tidak terbiasa menggunakan prosedur di PostgreSQL AWS SCT , dapat mengonversi prosedur ke fungsi. Untuk melakukannya, pilih **Konversi prosedur ke fungsi**.
+ Untuk meniru output `EXEC` dalam tabel.

  Database SQL Server sumber Anda dapat menyimpan output `EXEC` dalam tabel. AWS SCT membuat tabel sementara dan prosedur tambahan untuk meniru fitur ini. Untuk menggunakan emulasi ini, pilih **Buat rutinitas tambahan untuk menangani kumpulan data terbuka**.
+ Untuk menentukan template yang akan digunakan untuk nama skema dalam kode yang dikonversi. Untuk **templat pembuatan nama Skema**, pilih salah satu opsi berikut:
  + ****<source\_db>— Menggunakan nama database SQL Server sebagai nama skema di PostgreSQL.
  + ****<source\_schema>— Menggunakan nama skema SQL Server sebagai nama skema di PostgreSQL.
  + **\_** <source\_db><schema>— Menggunakan kombinasi database SQL Server dan nama skema sebagai nama skema di PostgreSQL.
+ Untuk menyimpan huruf huruf nama objek sumber Anda.

  Untuk menghindari konversi nama objek ke huruf kecil, pilih **Hindari casting ke huruf kecil untuk operasi peka huruf kecil**. Opsi ini hanya berlaku ketika Anda mengaktifkan opsi sensitivitas kasus di basis data target Anda.
+ Untuk menyimpan nama parameter dari database sumber Anda.

  Untuk menambahkan tanda kutip ganda ke nama parameter dalam kode yang dikonversi, pilih **Simpan nama parameter asli**.

## Mengkonversi partisi SQL Server ke PostgreSQL versi 10 partisi
<a name="CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions"></a>

Saat Anda mengonversi database Microsoft SQL Server ke Amazon Aurora PostgreSQL Compatible Edition (Aurora PostgreSQL) atau Amazon Relational Database Service untuk PostgreSQL (Amazon RDS for PostgreSQL), perhatikan hal-hal berikut.

Di SQL Server, Anda membuat partisi dengan fungsi partisi. Saat mengonversi dari tabel porsi SQL Server ke tabel partisi PostgreSQL versi 10, perhatikan beberapa masalah potensial:
+ SQL Server memungkinkan Anda untuk partisi tabel menggunakan kolom tanpa kendala NOT NULL. Dalam hal ini, semua nilai NULL pergi ke partisi paling kiri. PostgreSQL tidak mendukung nilai NULL untuk partisi RANGE.
+ SQL Server memungkinkan Anda membuat kunci primer dan unik untuk tabel yang dipartisi. Untuk PostgreSQL, Anda membuat kunci primer atau unik untuk setiap partisi secara langsung. Dengan demikian, kendala PRIMARY atau UNIQUE KEY harus dihapus dari tabel induknya saat bermigrasi ke PostgreSQL. Nama kunci yang dihasilkan mengambil format`<original_key_name>_<partition_number>`.
+ SQL Server memungkinkan Anda membuat batasan kunci asing dari dan ke tabel yang dipartisi. PostgreSQL tidak mendukung kunci asing yang mereferensikan tabel yang dipartisi. Juga, PostgreSQL tidak mendukung referensi kunci asing dari tabel yang dipartisi ke tabel lain.
+ SQL Server memungkinkan Anda membuat indeks untuk tabel yang dipartisi. Untuk PostgreSQL, indeks harus dibuat untuk setiap partisi secara langsung. Dengan demikian, indeks harus dihapus dari tabel induknya saat bermigrasi ke PostgreSQL. Nama indeks yang dihasilkan mengambil format`<original_index_name>_<partition_number>`.
+  PostgreSQL tidak mendukung indeks yang dipartisi.

## Pertimbangan migrasi
<a name="CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations"></a>

Beberapa hal yang perlu dipertimbangkan saat memigrasikan skema SQL Server ke PostgreSQL: 
+ Dalam PostgreSQL, semua nama objek dalam skema harus unik, termasuk indeks. Nama indeks harus unik dalam skema tabel dasar. Di SQL Server, nama indeks bisa sama untuk tabel yang berbeda.

  Untuk memastikan keunikan nama indeks, AWS SCT memberi Anda opsi untuk menghasilkan nama indeks unik jika nama indeks Anda tidak unik. Untuk melakukan ini, pilih opsi **Menghasilkan nama indeks unik** di properti proyek. Secara default, opsi ini diaktifkan. Jika opsi ini diaktifkan, nama indeks unik dibuat menggunakan format IX\_TABLE\_NAME\_INDEX\_NAME. Jika opsi ini dinonaktifkan, nama indeks tidak diubah.
+ Pernyataan GOTO dan label dapat digunakan untuk mengubah urutan pernyataan dijalankan. Setiap pernyataan Transact-SQL yang mengikuti pernyataan GOTO dilewati dan pemrosesan berlanjut pada label. Pernyataan dan label GOTO dapat digunakan di mana saja dalam prosedur, batch, atau blok pernyataan. Pernyataan GOTO juga dapat disarangkan.

  PostgreSQL tidak menggunakan pernyataan GOTO. Ketika AWS SCT mengkonversi kode yang berisi pernyataan GOTO, itu mengubah pernyataan untuk menggunakan pernyataan BEGIN... END atau LOOP... END LOOP. Anda dapat menemukan contoh bagaimana AWS SCT mengkonversi pernyataan GOTO dalam tabel berikut.  
**Pernyataan SQL Server GOTO dan pernyataan PostgreSQL dikonversi**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
+ PostgreSQL tidak mendukung pernyataan MERGE. AWS SCT mengemulasi perilaku pernyataan MERGE dengan cara berikut:
  + Dengan INSERT ON CONFLICT konstruksi.
  + Dengan menggunakan pernyataan UPDATE FROM DHTML, seperti MERGE tanpa klausa WHEN NOT MATCHED.
  + Dengan menggunakan CURSOR, seperti dengan klausa MERGE dengan DELETE atau dengan menggunakan pernyataan kondisi MERGE ON yang kompleks.
+ AWS SCT dapat menambahkan pemicu database ke pohon objek saat Amazon RDS adalah targetnya.
+ AWS SCT dapat menambahkan pemicu tingkat server ke pohon objek saat Amazon RDS adalah targetnya.
+ SQL Server secara otomatis membuat dan mengelola `deleted` dan `inserted` tabel. Anda dapat menggunakan tabel sementara, memori-residen ini untuk menguji efek modifikasi data tertentu dan untuk mengatur kondisi untuk tindakan pemicu DML. AWS SCT dapat mengonversi penggunaan tabel ini di dalam pernyataan pemicu DML.
+ AWS SCT dapat menambahkan server tertaut ke pohon objek saat Amazon RDS adalah targetnya.
+ Saat bermigrasi dari Microsoft SQL Server ke PostgreSQL, fungsi SUSER\_SNAME bawaan dikonversi sebagai berikut:
  + SUSER\_SNAME — Mengembalikan nama login yang terkait dengan nomor identifikasi keamanan (SID).
  + SUSER\_SNAME (<server\_user\_sid>) - Tidak didukung.
  + SUSER\_SNAME () CURRENT\_USER — Mengembalikan nama pengguna dari konteks eksekusi saat ini.
  + SUSER\_SNAME (NULL) - Mengembalikan NULL.
+ Mengonversi fungsi bernilai tabel didukung. Fungsi bernilai tabel mengembalikan tabel dan dapat menggantikan tabel dalam kueri.
+ PATINDEX mengembalikan posisi awal kemunculan pertama pola dalam ekspresi tertentu pada semua tipe data teks dan karakter yang valid. Ia mengembalikan nol jika pola tidak ditemukan. <pattern character><expression character varying>Saat mengonversi dari SQL Server ke Amazon RDS for AWS SCT PostgreSQL, ganti kode aplikasi yang menggunakan PATINDEX dengan aws\_sqlserver\_ext.patindex (,).
+ Di SQL Server, tipe tabel yang ditentukan pengguna adalah tipe yang mewakili definisi struktur tabel. Anda menggunakan tipe tabel yang ditentukan pengguna untuk mendeklarasikan parameter nilai tabel untuk prosedur atau fungsi yang disimpan. Anda juga dapat menggunakan tipe tabel yang ditentukan pengguna untuk mendeklarasikan variabel tabel yang ingin Anda gunakan dalam batch atau dalam badan prosedur atau fungsi yang disimpan. AWS SCT meniru jenis ini di PostgreSQL dengan membuat tabel sementara.

Saat mengonversi dari SQL Server ke PostgreSQL, AWS SCT mengubah objek sistem SQL Server menjadi objek yang dapat dikenali di PostgreSQL. Tabel berikut menunjukkan bagaimana objek sistem dikonversi. 

 


| Kasus penggunaan MS SQL Server | Substitusi PostgreSQL | 
| --- | --- | 
| SYS.SKEMA | AWS\_SQLSERVER\_EXT.SYS\_SKEMA | 
| SYS.TABLES | AWS\_SQLSERVER\_EXT.SYS\_TABLES | 
| SYS.PANDANGAN | AWS\_SQLSERVER\_EXT.SYS\_DILIHAT | 
| SYS.ALL\_VIEWS | AWS\_SQLSERVER\_EXT.SYS\_ALL\_VIEWS | 
| SYS.JENIS | AWS\_SQLSERVER\_EXT.SYS\_TYPES | 
| SYS.COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_COLUMNS | 
| SYS.ALL\_COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_ALL\_COLUMNS | 
| SYS.FOREIGN\_KEYS | AWS\_SQLSERVER\_EXT.SYS\_FOREIGN\_KEYS | 
| SYS.SYSFOREIGNKEYS | AWS\_SQLSERVER\_EXT.SYS\_SYSFOREIGNKEYS | 
| SYS.FOREIGN\_KEY\_COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_FOREIGN\_KEY\_COLUMNS | 
| SYS.KEY\_KENDALA | AWS\_SQLSERVER\_EXT.SYS\_KEY\_KENDALA | 
| SYS.IDENTITY\_COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_IDENTITY\_COLUMNS | 
| SYS.PROSEDUR | AWS\_SQLSERVER\_EXT.SYS\_PROSEDUR | 
| SYS.INDEXES | AWS\_SQLSERVER\_EXT.SYS\_INDEXES | 
| SYS.SYSINDEX | AWS\_SQLSERVER\_EXT.SYS\_SYSINDEXES | 
| SYS.OBJECTS | AWS\_SQLSERVER\_EXT.SYS\_OBJECTS | 
| SYS.ALL\_OBJECTS | AWS\_SQLSERVER\_EXT.SYS\_ALL\_OBJECTS | 
| SYS.SYSOBJECTS | AWS\_SQLSERVER\_EXT.SYS\_SYSOBJECTS | 
| SYS.SQL\_MODULES | AWS\_SQLSERVER\_EXT.SYS\_SQL\_MODULES | 
| SYS.DATABASE | AWS\_SQLSERVER\_EXT.SYS\_DATABASE | 
| INFORMATION\_SCHEMA.SCHEMATA  | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_SCHEMATA | 
| INFORMATION\_SCHEMA.VIEWS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_VIEWS | 
| INFORMATION\_SCHEMA.TABLES | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_TABLES | 
| INFORMATION\_SCHEMA.COLUMNS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_COLUMNS | 
| INFORMATION\_SCHEMA.CHECK\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_CHECK\_CONSTRAINTS | 
| INFORMATION\_SCHEMA.REFERENTIAL\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_REFERENTIAL\_CONSTRAINTS | 
| INFORMATION\_SCHEMA.TABLE\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_TABLE\_KENDALA | 
| INFORMATION\_SCHEMA.KEY\_COLUMN\_USAGE | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_KEY\_COLUMN\_USAGE | 
| INFORMATION\_SCHEMA.CONSTRAINT\_TABLE\_USAGE | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_CONSTRAINT\_TABLE\_USAGE  | 
| INFORMATION\_SCHEMA.CONSTRAINT\_COLUMN\_USAGE | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_CONSTRAINT\_COLUMN\_USAGE  | 
| INFORMATION\_SCHEMA.ROUTINES | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_RUTINES | 
| SYS.SYSPROCESSES | AWS\_SQLSERVER\_EXT.SYS\_SYSPROCESSS | 
| sys.system\_objects | AWS\_SQLSERVER\_EXT.SYS\_SYSTEM\_OBJECTS | 