Konversi PostgreSQL ke SQL Server
Letakkan dump plain dari pg_dump atau pg_dumpall, sebagai .sql atau .sql.gz, lalu unduh skrip SQL Server dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan SQL Server apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.
18 baris dikonversi, 2 perbaikan, tidak ada yang ditolak
Tabel di shop_2024_postgres.sqlDump PostgreSQL 18.6 · ditulis oleh pg_dump · utf8mb4
customers8 baris1
8 kolom id int not null name nvarchar(max) not null email nvarchar(450) not null country nvarchar(2) not null is_active bit not null tags nvarchar(max) not null signed_up date created_at datetimeoffset(6) not null orders10 baris1
10 kolom id int not null customer_id int not null status nvarchar(9) not null total decimal(10,2) not null items smallint not null ordered_at datetime2(6) not null shipped_at datetime2(6) note nvarchar(max) details nvarchar(max) delivery nvarchar(100)
Tidak dikonversi
- View paid_orders
Setiap database menulis objek ini dalam bahasanya sendiri. Tulis ulang untuk SQL Server.
-- Written by IntoSQL from a PostgreSQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO
CREATE TABLE [dbo].[customers] (
[id] int IDENTITY(1001, 1) NOT NULL,
[name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
[email] nvarchar(450) COLLATE Latin1_General_100_BIN2 NOT NULL,
[country] nvarchar(2) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
[is_active] bit DEFAULT 1 NOT NULL,
[tags] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
[signed_up] date NULL,
[created_at] datetimeoffset(6) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO
CREATE TABLE [dbo].[orders] (
[id] int IDENTITY(5001, 1) NOT NULL,
[customer_id] int NOT NULL,
[status] nvarchar(9) COLLATE Latin1_General_100_BIN2 DEFAULT N'pending' NOT NULL,
[total] decimal(10,2) NOT NULL,
[items] smallint DEFAULT 1 NOT NULL,
[ordered_at] datetime2(6) NOT NULL,
[shipped_at] datetime2(6) NULL,
[note] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
[details] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
[delivery] nvarchar(100) COLLATE Latin1_General_100_BIN2 NULL,
CONSTRAINT [CK_orders_status] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
CONSTRAINT [orders_total_check] CHECK ([total] >= (0)),
CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [tags], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,N'["vip"]','2023-01-15','2023-01-15 10:24:00+00:00'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,N'[]','2023-02-03','2023-02-03 08:11:42+00:00'),
(3,N'José Peña',N'jose@example.es',N'ES',0,N'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17+00:00'),
(4,N'李雷',N'lilei@example.cn',N'CN',1,N'[]','2023-05-09','2023-05-09 02:40:00+00:00'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,N'[]',NULL,'2023-06-30 14:00:00+00:00'),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,N'["vip"]','2024-01-02','2024-01-02 09:30:00+00:00'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,N'[]','2024-02-29','2024-02-29 23:59:59+00:00'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,N'[]','2024-04-12','2024-04-12 12:12:12+00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [details], [delivery]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,N'{"gift": false}',N'1 day 06:30:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',N'{"gift": true, "wrap": "red"}',NULL),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL,NULL),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',N'{"fragile": true}',N'2 days 05:50:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice',NULL,NULL),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',N'{"fragile": true}',N'20:00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),
(8,2,N'shipped',19.99,1,'2024-03-12 08:00:00',NULL,N'Shipped date set to infinity by an old import',NULL,NULL),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00',N'Two parcels',N'{"parcels": [1, 2]}',N'18:30:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [customers_email_key] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [orders_customer_id_fkey] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [orders_customer_id_fkey]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[orders_customer_id_fkey]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
Perbaikan
- "tags" di customers adalah text[], yang tidak ada di SQL Server, jadi menjadi nvarchar(max) dengan nilai yang sama.
- "delivery" di orders adalah interval, yang tidak ada di SQL Server, jadi menjadi nvarchar(100) dengan nilai yang sama.
Perlu diperiksa
- 1 view, trigger, rutin, atau event tidak dikonversi; laporan mencantumkan masing-masing. Buat ulang secara manual di SQL Server.
- Default "tags" di customers tidak bisa ditulis untuk SQL Server (a value its type can't hold), jadi kolom itu tanpa default. Tambahkan default secara manual jika baris baru memerlukannya.
- Indeks idx_orders_details pada orders memakai ekspresi yang tidak bisa ditulis untuk SQL Server (an index on an expression), jadi tidak dibuat. Buat indeks secara manual jika kueri memerlukannya.
- 1 nilai di "shipped_at" dari orders adalah tanggal yang tidak bisa disimpan SQL Server, misalnya infinity, jadi menjadi NULL. SQL Server menyimpan tahun 1 sampai 9999 tanpa infinity; ganti tanggal itu di sumber jika penting.
File Anda dikonversi di komputer ini dan tidak pernah diunggah.
Contoh lain:
Yang berubah dari PostgreSQL ke SQL Server
Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.
boolean
bit
bit menyimpan true sebagai 1 dan false sebagai 0.
varchar(n), char(n), text
nvarchar(n); text sebagai nvarchar(max), atau nvarchar(450) jika dipakai key dan setiap nilai muat
nvarchar memuat setiap karakter. SQL Server tidak bisa mengindeks nvarchar(max), jadi teks dalam key diberi ukuran yang muat untuk key.
text comparison
persis (Latin1_General_100_BIN2); citext mengabaikan huruf besar dan kecil (Latin1_General_100_CI_AS_SC)
Collation umum SQL Server mengabaikan huruf besar dan kecil, teks PostgreSQL tidak, jadi setiap kolom menyebutkan cara membandingkannya dan kunci unik tetap membedakan baris yang sama.
numeric(p,s) past 38 digits; numeric without a precision
nvarchar; decimal(p,s) sesuai nilainya jika muat dalam 38 digit
decimal di SQL Server memuat 38 digit. numeric tanpa presisi mendapat decimal tersempit yang memuat nilainya; angka yang lebih lebar disimpan sebagai teks agar setiap digit tetap persis.
Baris laporan: decimal_as_text
money
decimal(19,2)
money di SQL Server lebih kecil daripada di PostgreSQL dan punya empat desimal; decimal(19,2) memuat setiap jumlah, tanpa simbol mata uang dari locale server.
Baris laporan: type_replaced
interval
nvarchar(100) berisi teks PostgreSQL
SQL Server tidak punya tipe interval; teksnya mempertahankan setiap bagian.
Baris laporan: type_replaced
arrays (integer[], text[]...)
nvarchar(max) berisi array JSON
SQL Server tidak punya array. Array JSON mempertahankan setiap elemen dan NULL, dan OPENJSON membacanya.
Baris laporan: type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types
nvarchar(max) berisi teks PostgreSQL
SQL Server tidak punya tipe yang setara, jadi setiap nilai mempertahankan teks yang ditulis PostgreSQL.
Baris laporan: type_replaced
json, jsonb
nvarchar(max)
Fungsi JSON SQL Server membaca JSON dari teks.
timestamp
datetime2
timestamp tanpa zona waktu adalah pembacaan jam dinding, seperti datetime2.
timestamp with time zone
datetimeoffset dalam UTC
datetimeoffset mempertahankan momen; setiap nilai ditulis dalam UTC, momen yang sama apa pun selisih yang ditulis dump.
time with 24:00:00 in it
nvarchar(17)
time di SQL Server berakhir pada 23:59:59.9999999, jadi kolom yang berisi 24:00:00 mempertahankan teksnya.
Baris laporan: time_as_interval
infinity, -infinity and BC dates
NULL
SQL Server menyimpan tahun 1 sampai 9999 tanpa infinity. Nilai itu menjadi NULL dan laporan menghitungnya.
Baris laporan: date_out_of_range
NaN and Infinity in numeric, real and double precision
NULL
Angka di SQL Server tidak punya NaN atau Infinity, jadi nilai itu menjadi NULL dan laporan menghitungnya.
Baris laporan: invalid_value_null
NOT NULL columns with values that become NULL
NOT NULL dihapus
Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.
Baris laporan: not_null_relaxed
enum types
nvarchar dengan CHECK labelnya
Teks dengan CHECK mempertahankan nilai yang sama.
enum columns holding values outside their labels
nvarchar tanpa CHECK
Nilai yang tidak ada di label akan gagal di CHECK, jadi CHECK tidak dibuat.
Baris laporan: enum_check_skipped
uuid, inet, cidr, macaddr
uniqueidentifier; alamat sebagai nvarchar
uniqueidentifier adalah UUID di SQL Server; alamat disimpan sebagai teks.
bytea
varbinary(max)
Byte tetap byte.
bit(n), bit varying
bit untuk satu bit; bigint hingga 63 bit; digit teks jika lebih
Satu bit berarti ya atau tidak; string bit yang lebih panjang disimpan sebagai angka yang dibentuk bit-bitnya.
oid, xid, cid
bigint dengan CHECK bahwa nilainya tidak negatif
bigint memuat setiap nilai.
serial, identity
IDENTITY, berlanjut setelah id tertinggi
Id yang disalin dimuat dengan IDENTITY_INSERT, dan penghitung berlanjut setelah id tertinggi atau nilai berikutnya dari sequence, mana yang lebih tinggi.
a second serial or identity column in a table
bilangan bulat biasa
SQL Server menghitung satu kolom IDENTITY per tabel; kolom lain mempertahankan nilainya tanpa penghitung.
Baris laporan: counter_dropped
sequences not owned by a column
CREATE SEQUENCE ... AS bigint, dengan nilai berikutnya
SQL Server punya sequence dengan opsi yang sama; masing-masing berlanjut dari posisi terakhir di dump.
generated columns
kolom computed, PERSISTED jika sumber menyimpannya
SQL Server menghitungnya dengan dua cara yang sama.
generated columns with functions SQL Server lacks
kolom biasa berisi nilainya
Rumus yang tidak bisa ditulis untuk SQL Server menyisakan kolom biasa berisi nilai dari dump dan satu baris laporan.
Baris laporan: generated_not_translated
defaults with functions SQL Server lacks, and defaults from a sequence
tanpa default
Default yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan.
Baris laporan: default_not_translated
CHECK constraints
diterjemahkan, langsung di CREATE TABLE
CHECK di dalam tabel diuji saat setiap baris dimuat.
CHECK constraints with functions SQL Server lacks
tidak dibuat
CHECK yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan.
Baris laporan: check_skipped
CHECK ... NOT VALID
tidak dibuat
PostgreSQL tidak pernah memeriksa baris yang sudah ada sebelumnya, jadi baris itu bisa melanggarnya.
Baris laporan: check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key
tidak dibuat
SQL Server mengindeks kolom, bukan ekspresi, dan bukan nvarchar(max).
Baris laporan: index_skipped
foreign keys
setelah data WITH NOCHECK, lalu diperiksa dengan peringatan untuk baris tanpa induk
Key dibuat setelah baris dan diperiksa terakhir; baris tanpa induk membuatnya tetap tidak diperiksa dengan peringatan, bukan menghentikan pemuatan.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server menolak cascade yang bisa mencapai satu tabel dua kali; PostgreSQL mengizinkannya.
Baris laporan: foreign_key_action_dropped
foreign keys to tables the dump doesn't create
tidak dibuat
Key tidak bisa merujuk ke tabel yang tidak ada.
Baris laporan: foreign_key_skipped
partitioned tables
satu tabel dengan baris dari setiap partisi
Barisnya sama; partisi ulang tabel di SQL Server jika diperlukan.
Baris laporan: partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types
dicantumkan di laporan
Kodenya ditulis dalam bahasa PostgreSQL, jadi dicantumkan agar Anda buat ulang.
Baris laporan: not_converted_objects
dumps without CREATE TABLE (--data-only)
tipe dibaca dari nilainya
Dump yang hanya berisi data hanya punya baris, jadi tipenya berasal dari nilainya.
Baris laporan: no_schema
expressions in INSERT values
NULL
Konverter yang tidak menjalankan database tidak bisa mengevaluasinya.
Baris laporan: expression_value
types IntoSQL doesn't know
nvarchar(max)
Teks memuat nilai apa pun; ubah tipenya setelah pemuatan.
Baris laporan: unknown_type
text that isn't valid in its encoding
byte yang rusak menjadi karakter pengganti
nvarchar memuat teks Unicode.
Baris laporan: invalid_utf8_replaced
text decoded twice (ñ)
disalin apa adanya
Dump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.
Baris laporan: mojibake_suspected
| Di PostgreSQL | Di SQL Server | Baris laporan |
|---|---|---|
| boolean | bitbit menyimpan true sebagai 1 dan false sebagai 0. | |
| varchar(n), char(n), text | nvarchar(n); text sebagai nvarchar(max), atau nvarchar(450) jika dipakai key dan setiap nilai muatnvarchar memuat setiap karakter. SQL Server tidak bisa mengindeks nvarchar(max), jadi teks dalam key diberi ukuran yang muat untuk key. | |
| text comparison | persis (Latin1_General_100_BIN2); citext mengabaikan huruf besar dan kecil (Latin1_General_100_CI_AS_SC)Collation umum SQL Server mengabaikan huruf besar dan kecil, teks PostgreSQL tidak, jadi setiap kolom menyebutkan cara membandingkannya dan kunci unik tetap membedakan baris yang sama. | |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; decimal(p,s) sesuai nilainya jika muat dalam 38 digitdecimal di SQL Server memuat 38 digit. numeric tanpa presisi mendapat decimal tersempit yang memuat nilainya; angka yang lebih lebar disimpan sebagai teks agar setiap digit tetap persis. | decimal_as_text |
| money | decimal(19,2)money di SQL Server lebih kecil daripada di PostgreSQL dan punya empat desimal; decimal(19,2) memuat setiap jumlah, tanpa simbol mata uang dari locale server. | type_replaced |
| interval | nvarchar(100) berisi teks PostgreSQLSQL Server tidak punya tipe interval; teksnya mempertahankan setiap bagian. | type_replaced |
| arrays (integer[], text[]...) | nvarchar(max) berisi array JSONSQL Server tidak punya array. Array JSON mempertahankan setiap elemen dan NULL, dan OPENJSON membacanya. | type_replaced |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | nvarchar(max) berisi teks PostgreSQLSQL Server tidak punya tipe yang setara, jadi setiap nilai mempertahankan teks yang ditulis PostgreSQL. | type_replaced |
| json, jsonb | nvarchar(max)Fungsi JSON SQL Server membaca JSON dari teks. | |
| timestamp | datetime2timestamp tanpa zona waktu adalah pembacaan jam dinding, seperti datetime2. | |
| timestamp with time zone | datetimeoffset dalam UTCdatetimeoffset mempertahankan momen; setiap nilai ditulis dalam UTC, momen yang sama apa pun selisih yang ditulis dump. | |
| time with 24:00:00 in it | nvarchar(17)time di SQL Server berakhir pada 23:59:59.9999999, jadi kolom yang berisi 24:00:00 mempertahankan teksnya. | time_as_interval |
| infinity, -infinity and BC dates | NULLSQL Server menyimpan tahun 1 sampai 9999 tanpa infinity. Nilai itu menjadi NULL dan laporan menghitungnya. | date_out_of_range |
| NaN and Infinity in numeric, real and double precision | NULLAngka di SQL Server tidak punya NaN atau Infinity, jadi nilai itu menjadi NULL dan laporan menghitungnya. | invalid_value_null |
| NOT NULL columns with values that become NULL | NOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti. | not_null_relaxed |
| enum types | nvarchar dengan CHECK labelnyaTeks dengan CHECK mempertahankan nilai yang sama. | |
| enum columns holding values outside their labels | nvarchar tanpa CHECKNilai yang tidak ada di label akan gagal di CHECK, jadi CHECK tidak dibuat. | enum_check_skipped |
| uuid, inet, cidr, macaddr | uniqueidentifier; alamat sebagai nvarcharuniqueidentifier adalah UUID di SQL Server; alamat disimpan sebagai teks. | |
| bytea | varbinary(max)Byte tetap byte. | |
| bit(n), bit varying | bit untuk satu bit; bigint hingga 63 bit; digit teks jika lebihSatu bit berarti ya atau tidak; string bit yang lebih panjang disimpan sebagai angka yang dibentuk bit-bitnya. | |
| oid, xid, cid | bigint dengan CHECK bahwa nilainya tidak negatifbigint memuat setiap nilai. | |
| serial, identity | IDENTITY, berlanjut setelah id tertinggiId yang disalin dimuat dengan IDENTITY_INSERT, dan penghitung berlanjut setelah id tertinggi atau nilai berikutnya dari sequence, mana yang lebih tinggi. | |
| a second serial or identity column in a table | bilangan bulat biasaSQL Server menghitung satu kolom IDENTITY per tabel; kolom lain mempertahankan nilainya tanpa penghitung. | counter_dropped |
| sequences not owned by a column | CREATE SEQUENCE ... AS bigint, dengan nilai berikutnyaSQL Server punya sequence dengan opsi yang sama; masing-masing berlanjut dari posisi terakhir di dump. | |
| generated columns | kolom computed, PERSISTED jika sumber menyimpannyaSQL Server menghitungnya dengan dua cara yang sama. | |
| generated columns with functions SQL Server lacks | kolom biasa berisi nilainyaRumus yang tidak bisa ditulis untuk SQL Server menyisakan kolom biasa berisi nilai dari dump dan satu baris laporan. | generated_not_translated |
| defaults with functions SQL Server lacks, and defaults from a sequence | tanpa defaultDefault yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan. | default_not_translated |
| CHECK constraints | diterjemahkan, langsung di CREATE TABLECHECK di dalam tabel diuji saat setiap baris dimuat. | |
| CHECK constraints with functions SQL Server lacks | tidak dibuatCHECK yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan. | check_skipped |
| CHECK ... NOT VALID | tidak dibuatPostgreSQL tidak pernah memeriksa baris yang sudah ada sebelumnya, jadi baris itu bisa melanggarnya. | check_not_valid |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key | tidak dibuatSQL Server mengindeks kolom, bukan ekspresi, dan bukan nvarchar(max). | index_skipped |
| foreign keys | setelah data WITH NOCHECK, lalu diperiksa dengan peringatan untuk baris tanpa indukKey dibuat setelah baris dan diperiksa terakhir; baris tanpa induk membuatnya tetap tidak diperiksa dengan peringatan, bukan menghentikan pemuatan. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server menolak cascade yang bisa mencapai satu tabel dua kali; PostgreSQL mengizinkannya. | foreign_key_action_dropped |
| foreign keys to tables the dump doesn't create | tidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada. | foreign_key_skipped |
| partitioned tables | satu tabel dengan baris dari setiap partisiBarisnya sama; partisi ulang tabel di SQL Server jika diperlukan. | partitions_dropped |
| views, functions, procedures, triggers, rules, policies, extensions and types | dicantumkan di laporanKodenya ditulis dalam bahasa PostgreSQL, jadi dicantumkan agar Anda buat ulang. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | tipe dibaca dari nilainyaDump yang hanya berisi data hanya punya baris, jadi tipenya berasal dari nilainya. | no_schema |
| expressions in INSERT values | NULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya. | expression_value |
| types IntoSQL doesn't know | nvarchar(max)Teks memuat nilai apa pun; ubah tipenya setelah pemuatan. | unknown_type |
| text that isn't valid in its encoding | byte yang rusak menjadi karakter penggantinvarchar memuat teks Unicode. | invalid_utf8_replaced |
| text decoded twice (ñ) | disalin apa adanyaDump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya. | mojibake_suspected |
Muat skrip ke SQL Server
Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.
sqlcmd -b -f 65001 -S localhost -d mydb -i postgresql.sql_server.sqlForeign key ditambahkan WITH NOCHECK lalu diperiksa. Jika sebuah baris merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak diperiksa, bukan gagal di tengah jalan.
Untuk dump yang besar, jalankan sqlcmd di mesin yang sama dengan server. Setiap batch berisi maksimal 1000 baris di-commit sendiri, jadi log transaksi tetap kecil.
Buat dump PostgreSQL untuk hasil terbaik
Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:
- --format=plain, default pg_dump, menulis SQL. Arsip custom atau directory (-Fc, -Fd) menjadi SQL dengan pg_restore -f dump.sql, tanpa server database.
- --no-owner --no-privileges menghilangkan role dan grant, yang memang dilewati konverter, jadi dump lebih kecil.
- pg_dumpall menyimpan setiap database dalam satu file; tabel masing-masing diberi nama sesuai database-nya, jadi tidak ada yang bentrok.
Yang tidak dikonversi
View, materialized view, fungsi, prosedur, trigger, rule, kebijakan keamanan baris, ekstensi, dan tipe ditulis dalam bahasa PostgreSQL sendiri. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk SQL Server.
Pertanyaan tentang PostgreSQL ke SQL Server
Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak
Apakah dump saya diunggah?
Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.
Seberapa besar dump yang bisa dipakai?
Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.
Apakah arsip pg_dump -Fc bisa dibaca?
Tidak langsung: arsip custom adalah format biner. pg_restore -f dump.sql dump.backup mengubahnya menjadi SQL plain yang dibaca konverter, tanpa terhubung ke server. Konverter memberi tahu saat menerima arsip.
Dump dari versi PostgreSQL mana yang bisa dipakai?
Dump yang ditulis pg_dump dan pg_dumpall dari PostgreSQL 10 ke atas, dengan baris COPY atau INSERT. Setiap dump uji berasal dari PostgreSQL 13 dan 18 dan dibandingkan dengan sumbernya sel demi sel.
Apakah nilai serial dan identity dipertahankan?
Ya. Kolom serial atau identity setiap tabel menjadi kolom IDENTITY, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi. SQL Server menghitung satu kolom per tabel, jadi kolom lain mempertahankan nilainya tanpa penghitung.
Apa yang terjadi pada array, enum, dan tipe PostgreSQL lainnya?
Array menjadi array JSON, boolean menjadi bit, uuid menjadi uniqueidentifier, dan timestamp dengan zona waktu menjadi datetimeoffset. Teks dibandingkan secara persis, seperti di PostgreSQL, dan citext mengabaikan huruf besar dan kecil. Range, tipe geometris, dan tipe komposit mempertahankan teks PostgreSQL.
Bagaimana dengan fungsi, trigger, dan view?
Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.
Di versi SQL Server mana skrip bisa dimuat?
SQL Server 2017 sampai 2025. Skrip yang sama dimuat di setiap versi itu, dan berhenti di galat pertama jika ada yang salah.