PostgreSQL - SQL Server dönüştürme
pg_dump veya pg_dumpall ile alınmış düz bir dökümü .sql veya .sql.gz olarak bırakın ve aynı tablolar, anahtarlar, indeksler ve verilerle bir SQL Server betiği indirin. SQL Server'in olduğu gibi tutamadığı her değer ve taşımadığı her nesne raporda listelenir.
18 satır dönüştürüldü, 2 düzeltme, reddedilen yok
shop_2024_postgres.sql içindeki tablolarPostgreSQL 18.6 dökümü · pg_dump ile yazıldı · utf8mb4
customers8 satır1
8 sütun 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 satır1
10 sütun 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)
Dönüştürülmedi
- Görünüm paid_orders
Her veritabanı bunları kendi dilinde yazar. Bunları SQL Server için yeniden yazın.
-- 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
Düzeltmeler
- customers tablosunun "tags" sütunu text[]; SQL Server içinde bu tür yok, bu yüzden aynı değerlerle nvarchar(max) olur.
- orders tablosunun "delivery" sütunu interval; SQL Server içinde bu tür yok, bu yüzden aynı değerlerle nvarchar(100) olur.
Kontrol edilmeli
- 1 görünüm, tetikleyici, rutin veya olay dönüştürülmedi; rapor her birini listeliyor. Bunları SQL Server'de elle yeniden oluşturun.
- customers tablosundaki "tags" sütununun varsayılan değeri SQL Server için yazılamıyor (a value its type can't hold); bu yüzden sütunun varsayılan değeri yok. Yeni satırlar gerektiriyorsa varsayılan değeri elle ekleyin.
- orders üzerindeki idx_orders_details indeksi SQL Server için yazılamayan bir ifade kullanıyor (an index on an expression); bu yüzden oluşturulmadı. Sorgular gerektiriyorsa indeksi elle oluşturun.
- orders tablosunun "shipped_at" sütunundaki 1 değer, infinity gibi SQL Server'in saklayamadığı bir tarih; bu yüzden NULL yapıldı. SQL Server sonsuzluk olmadan 1 ile 9999 arası yılları saklar; bu tarihler önemliyse kaynakta değiştirin.
Dosyan bu bilgisayarda dönüştürülür ve asla yüklenmez.
Diğer örnekler:
PostgreSQL ile SQL Server arasında neler değişir
Her satır, dönüştürücünün uyguladığı bir kuraldır; yanında, kural verilerinizde bir şeyi değiştirdiğinde yazılan rapor satırı yer alır.
boolean
bit
bit, true'yu 1 ve false'u 0 olarak tutar.
varchar(n), char(n), text
nvarchar(n); text nvarchar(max) olarak, bir anahtar kullanıyorsa ve her değer sığıyorsa nvarchar(450)
nvarchar her karakteri tutar. SQL Server nvarchar(max) indeksleyemez, bu yüzden bir anahtardaki metin anahtara sığacak boyutta olur.
text comparison
tam (Latin1_General_100_BIN2); citext büyük/küçük harfi yok sayar (Latin1_General_100_CI_AS_SC)
SQL Server'ın olağan harmanlaması büyük/küçük harfi yok sayar, PostgreSQL'in metni saymaz; bu yüzden her sütun nasıl karşılaştırdığını belirtir ve benzersiz anahtarlar aynı satırları ayrı tutar.
numeric(p,s) past 38 digits; numeric without a precision
nvarchar; değerler 38 basamağa sığıyorsa onlara uyan decimal(p,s)
SQL Server'ın decimal türü 38 basamak tutar. Duyarlılığı olmayan bir numeric, değerlerinin sığdığı en dar decimal'i alır; daha geniş sayılar her basamak tam kalsın diye metin olarak korunur.
Rapor satırı: decimal_as_text
money
decimal(19,2)
SQL Server'ın money türü PostgreSQL'inkinden küçüktür ve dört ondalığı vardır; decimal(19,2), sunucunun yerel ayarının eklediği para birimi simgesi olmadan her tutarı tutar.
Rapor satırı: type_replaced
interval
PostgreSQL'in metniyle nvarchar(100)
SQL Server'da interval türü yoktur; metin her parçayı korur.
Rapor satırı: type_replaced
arrays (integer[], text[]...)
JSON dizisiyle nvarchar(max)
SQL Server'da dizi yoktur. Bir JSON dizisi her öğeyi ve NULL'u korur ve OPENJSON onu okur.
Rapor satırı: type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types
PostgreSQL'in metniyle nvarchar(max)
SQL Server'da karşılık gelen bir tür yoktur, bu yüzden her değer PostgreSQL'in yazdığı metni korur.
Rapor satırı: type_replaced
json, jsonb
nvarchar(max)
SQL Server'ın JSON fonksiyonları JSON'u metinden okur.
timestamp
datetime2
Saat dilimi olmayan bir timestamp, datetime2 gibi bir duvar saati okumasıdır.
timestamp with time zone
UTC'de datetimeoffset
datetimeoffset anı korur; her değer UTC'de yazılır, döküm hangi farkı yazmış olursa olsun an aynıdır.
time with 24:00:00 in it
nvarchar(17)
SQL Server'ın time türü 23:59:59.9999999'da biter, bu yüzden 24:00:00 tutan bir sütun metnini korur.
Rapor satırı: time_as_interval
infinity, -infinity and BC dates
NULL
SQL Server sonsuzluk olmadan 1 ile 9999 arası yılları saklar. Bu değerler NULL olur ve rapor onları sayar.
Rapor satırı: date_out_of_range
NaN and Infinity in numeric, real and double precision
NULL
SQL Server'ın sayılarında NaN veya Infinity yoktur, bu yüzden bu değerler NULL olur ve rapor onları sayar.
Rapor satırı: invalid_value_null
NOT NULL columns with values that become NULL
NOT NULL kaldırılır
Değerleri NULL olmak zorunda kalan bir sütun NOT NULL kısıtını koruyamaz, yoksa yükleme durur.
Rapor satırı: not_null_relaxed
enum types
etiketlerini denetleyen bir CHECK ile nvarchar
CHECK ile metin aynı değerleri korur.
enum columns holding values outside their labels
CHECK olmadan nvarchar
Etiketlerde adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz.
Rapor satırı: enum_check_skipped
uuid, inet, cidr, macaddr
uniqueidentifier; adresler nvarchar olarak
uniqueidentifier, SQL Server'ın UUID türüdür; adresler metin olarak korunur.
bytea
varbinary(max)
Baytlar bayt olarak kalır.
bit(n), bit varying
tek bit için bit; 63 bite kadar bigint; ötesi metin basamakları
Tek bir bit evet veya hayırdır; daha uzun bit dizileri bitlerinin oluşturduğu sayı olarak saklanır.
oid, xid, cid
negatif olmadığını denetleyen bir CHECK ile bigint
bigint her değeri tutar.
serial, identity
en yüksek id'den sonra devam eden IDENTITY
Kopyalanan id'ler IDENTITY_INSERT ile yüklenir ve sayaç, en yüksek id'den veya sequence'ın sonraki değerinden (hangisi büyükse) sonra devam eder.
a second serial or identity column in a table
düz bir tam sayı
SQL Server tablo başına tek IDENTITY sütunu sayar; diğerleri değerlerini sayaçsız korur.
Rapor satırı: counter_dropped
sequences not owned by a column
sonraki değeriyle CREATE SEQUENCE ... AS bigint
SQL Server'da aynı seçeneklere sahip sequence'lar vardır; her biri dökümün bıraktığı yerden devam eder.
generated columns
hesaplanan sütunlar, kaynak onları saklıyorsa PERSISTED
SQL Server bunları aynı iki şekilde hesaplar.
generated columns with functions SQL Server lacks
değerleriyle düz bir sütun
SQL Server için yazılamayan bir formül, dökümün değerleriyle düz bir sütun ve bir rapor satırı bırakır.
Rapor satırı: generated_not_translated
defaults with functions SQL Server lacks, and defaults from a sequence
varsayılan değer yok
SQL Server için yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır.
Rapor satırı: default_not_translated
CHECK constraints
çevrilir, CREATE TABLE içinde satır içi
Satır içi CHECK kısıtları her satır yüklenirken test edilir.
CHECK constraints with functions SQL Server lacks
oluşturulmaz
SQL Server için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.
Rapor satırı: check_skipped
CHECK ... NOT VALID
oluşturulmaz
PostgreSQL daha önce var olan satırları hiç denetlemedi, bu yüzden satırlar onu ihlal edebilir.
Rapor satırı: check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key
oluşturulmaz
SQL Server ifadeleri değil sütunları indeksler, nvarchar(max) sütunlarını da indekslemez.
Rapor satırı: index_skipped
foreign keys
veriden sonra WITH NOCHECK, ardından yetim satırlar için uyarıyla denetlenir
Anahtar satırlardan sonra oluşturulur ve en son denetlenir; üst satırı olmayan satırlar varsa yüklemeyi durdurmak yerine anahtar bir uyarıyla denetlenmemiş kalır.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server bir tabloya iki kez ulaşabilecek zincirleme işlemleri reddeder; PostgreSQL bunlara izin verir.
Rapor satırı: foreign_key_action_dropped
foreign keys to tables the dump doesn't create
oluşturulmaz
Bir anahtar, var olmayan bir tabloya başvuramaz.
Rapor satırı: foreign_key_skipped
partitioned tables
her bölümün satırlarını içeren tek tablo
Satırlar aynıdır; gerekiyorsa tabloyu SQL Server'da yeniden bölümleyin.
Rapor satırı: partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types
raporda listelenir
Kodları PostgreSQL'in dilinde yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.
Rapor satırı: not_converted_objects
dumps without CREATE TABLE (--data-only)
değerlerden okunan türler
Yalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir.
Rapor satırı: no_schema
expressions in INSERT values
NULL
Veritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz.
Rapor satırı: expression_value
types IntoSQL doesn't know
nvarchar(max)
Metin her değeri tutar; yüklemeden sonra türü değiştirin.
Rapor satırı: unknown_type
text that isn't valid in its encoding
hatalı baytlar yerine koyma karakteri olarak
nvarchar Unicode metin tutar.
Rapor satırı: invalid_utf8_replaced
text decoded twice (ñ)
olduğu gibi kopyalanır
Döküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.
Rapor satırı: mojibake_suspected
| PostgreSQL içinde | SQL Server içinde | Rapor satırı |
|---|---|---|
| boolean | bitbit, true'yu 1 ve false'u 0 olarak tutar. | |
| varchar(n), char(n), text | nvarchar(n); text nvarchar(max) olarak, bir anahtar kullanıyorsa ve her değer sığıyorsa nvarchar(450)nvarchar her karakteri tutar. SQL Server nvarchar(max) indeksleyemez, bu yüzden bir anahtardaki metin anahtara sığacak boyutta olur. | |
| text comparison | tam (Latin1_General_100_BIN2); citext büyük/küçük harfi yok sayar (Latin1_General_100_CI_AS_SC)SQL Server'ın olağan harmanlaması büyük/küçük harfi yok sayar, PostgreSQL'in metni saymaz; bu yüzden her sütun nasıl karşılaştırdığını belirtir ve benzersiz anahtarlar aynı satırları ayrı tutar. | |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; değerler 38 basamağa sığıyorsa onlara uyan decimal(p,s)SQL Server'ın decimal türü 38 basamak tutar. Duyarlılığı olmayan bir numeric, değerlerinin sığdığı en dar decimal'i alır; daha geniş sayılar her basamak tam kalsın diye metin olarak korunur. | decimal_as_text |
| money | decimal(19,2)SQL Server'ın money türü PostgreSQL'inkinden küçüktür ve dört ondalığı vardır; decimal(19,2), sunucunun yerel ayarının eklediği para birimi simgesi olmadan her tutarı tutar. | type_replaced |
| interval | PostgreSQL'in metniyle nvarchar(100)SQL Server'da interval türü yoktur; metin her parçayı korur. | type_replaced |
| arrays (integer[], text[]...) | JSON dizisiyle nvarchar(max)SQL Server'da dizi yoktur. Bir JSON dizisi her öğeyi ve NULL'u korur ve OPENJSON onu okur. | type_replaced |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | PostgreSQL'in metniyle nvarchar(max)SQL Server'da karşılık gelen bir tür yoktur, bu yüzden her değer PostgreSQL'in yazdığı metni korur. | type_replaced |
| json, jsonb | nvarchar(max)SQL Server'ın JSON fonksiyonları JSON'u metinden okur. | |
| timestamp | datetime2Saat dilimi olmayan bir timestamp, datetime2 gibi bir duvar saati okumasıdır. | |
| timestamp with time zone | UTC'de datetimeoffsetdatetimeoffset anı korur; her değer UTC'de yazılır, döküm hangi farkı yazmış olursa olsun an aynıdır. | |
| time with 24:00:00 in it | nvarchar(17)SQL Server'ın time türü 23:59:59.9999999'da biter, bu yüzden 24:00:00 tutan bir sütun metnini korur. | time_as_interval |
| infinity, -infinity and BC dates | NULLSQL Server sonsuzluk olmadan 1 ile 9999 arası yılları saklar. Bu değerler NULL olur ve rapor onları sayar. | date_out_of_range |
| NaN and Infinity in numeric, real and double precision | NULLSQL Server'ın sayılarında NaN veya Infinity yoktur, bu yüzden bu değerler NULL olur ve rapor onları sayar. | invalid_value_null |
| NOT NULL columns with values that become NULL | NOT NULL kaldırılırDeğerleri NULL olmak zorunda kalan bir sütun NOT NULL kısıtını koruyamaz, yoksa yükleme durur. | not_null_relaxed |
| enum types | etiketlerini denetleyen bir CHECK ile nvarcharCHECK ile metin aynı değerleri korur. | |
| enum columns holding values outside their labels | CHECK olmadan nvarcharEtiketlerde adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz. | enum_check_skipped |
| uuid, inet, cidr, macaddr | uniqueidentifier; adresler nvarchar olarakuniqueidentifier, SQL Server'ın UUID türüdür; adresler metin olarak korunur. | |
| bytea | varbinary(max)Baytlar bayt olarak kalır. | |
| bit(n), bit varying | tek bit için bit; 63 bite kadar bigint; ötesi metin basamaklarıTek bir bit evet veya hayırdır; daha uzun bit dizileri bitlerinin oluşturduğu sayı olarak saklanır. | |
| oid, xid, cid | negatif olmadığını denetleyen bir CHECK ile bigintbigint her değeri tutar. | |
| serial, identity | en yüksek id'den sonra devam eden IDENTITYKopyalanan id'ler IDENTITY_INSERT ile yüklenir ve sayaç, en yüksek id'den veya sequence'ın sonraki değerinden (hangisi büyükse) sonra devam eder. | |
| a second serial or identity column in a table | düz bir tam sayıSQL Server tablo başına tek IDENTITY sütunu sayar; diğerleri değerlerini sayaçsız korur. | counter_dropped |
| sequences not owned by a column | sonraki değeriyle CREATE SEQUENCE ... AS bigintSQL Server'da aynı seçeneklere sahip sequence'lar vardır; her biri dökümün bıraktığı yerden devam eder. | |
| generated columns | hesaplanan sütunlar, kaynak onları saklıyorsa PERSISTEDSQL Server bunları aynı iki şekilde hesaplar. | |
| generated columns with functions SQL Server lacks | değerleriyle düz bir sütunSQL Server için yazılamayan bir formül, dökümün değerleriyle düz bir sütun ve bir rapor satırı bırakır. | generated_not_translated |
| defaults with functions SQL Server lacks, and defaults from a sequence | varsayılan değer yokSQL Server için yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır. | default_not_translated |
| CHECK constraints | çevrilir, CREATE TABLE içinde satır içiSatır içi CHECK kısıtları her satır yüklenirken test edilir. | |
| CHECK constraints with functions SQL Server lacks | oluşturulmazSQL Server için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır. | check_skipped |
| CHECK ... NOT VALID | oluşturulmazPostgreSQL daha önce var olan satırları hiç denetlemedi, bu yüzden satırlar onu ihlal edebilir. | check_not_valid |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key | oluşturulmazSQL Server ifadeleri değil sütunları indeksler, nvarchar(max) sütunlarını da indekslemez. | index_skipped |
| foreign keys | veriden sonra WITH NOCHECK, ardından yetim satırlar için uyarıyla denetlenirAnahtar satırlardan sonra oluşturulur ve en son denetlenir; üst satırı olmayan satırlar varsa yüklemeyi durdurmak yerine anahtar bir uyarıyla denetlenmemiş kalır. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server bir tabloya iki kez ulaşabilecek zincirleme işlemleri reddeder; PostgreSQL bunlara izin verir. | foreign_key_action_dropped |
| foreign keys to tables the dump doesn't create | oluşturulmazBir anahtar, var olmayan bir tabloya başvuramaz. | foreign_key_skipped |
| partitioned tables | her bölümün satırlarını içeren tek tabloSatırlar aynıdır; gerekiyorsa tabloyu SQL Server'da yeniden bölümleyin. | partitions_dropped |
| views, functions, procedures, triggers, rules, policies, extensions and types | raporda listelenirKodları PostgreSQL'in dilinde yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | değerlerden okunan türlerYalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir. | no_schema |
| expressions in INSERT values | NULLVeritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz. | expression_value |
| types IntoSQL doesn't know | nvarchar(max)Metin her değeri tutar; yüklemeden sonra türü değiştirin. | unknown_type |
| text that isn't valid in its encoding | hatalı baytlar yerine koyma karakteri olaraknvarchar Unicode metin tutar. | invalid_utf8_replaced |
| text decoded twice (ñ) | olduğu gibi kopyalanırDöküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir. | mojibake_suspected |
Betiği SQL Server veritabanına yükleyin
Betik tabloları oluşturur, satırları kopyalar, ardından anahtarları, indeksleri ve yabancı anahtarları ekler; böylece hızlı yüklenir ve ilk hatada durur.
sqlcmd -b -f 65001 -S localhost -d mydb -i postgresql.sql_server.sqlYabancı anahtarlar WITH NOCHECK ile eklenir ve ardından denetlenir. Bir satır var olmayan bir satıra işaret ediyorsa betik, yarı yolda başarısız olmak yerine hangi kısıt olduğunu söyler ve onu denetlenmemiş bırakır.
Büyük bir döküm için sqlcmd'yi sunucuyla aynı makinede çalıştırın. En fazla 1000 satırlık her toplu iş kendi başına işlenir; böylece işlem günlüğü küçük kalır.
En iyi sonuç için PostgreSQL dökümü nasıl alınır
Dönüştürücü, dökümün içerdiğini okur. Bu seçenekler verilerinizin daha fazlasını dökümde tutar:
- --format=plain, pg_dump'ın varsayılanı, SQL yazar. Custom veya directory arşivi (-Fc, -Fd), veritabanı sunucusu olmadan pg_restore -f dump.sql ile SQL'e çevrilir.
- --no-owner --no-privileges rolleri ve yetkileri dışarıda bırakır; dönüştürücü bunları zaten atlar, böylece döküm küçülür.
- pg_dumpall her veritabanını tek dosyaya döker; her birinin tablolarının adı onun adıyla başlar, böylece hiçbir şey çakışmaz.
Neler dönüştürülmez
Görünümler, somutlaştırılmış görünümler, fonksiyonlar, saklı yordamlar, tetikleyiciler, kurallar, satır güvenlik ilkeleri, eklentiler ve türler PostgreSQL'in kendi dilinde yazılır. Raporda adlarıyla listelenirler, asla sessizce atlanmazlar; böylece onları SQL Server için yeniden yazabilirsiniz.
PostgreSQL - SQL Server dönüştürme hakkında sorular
Yanıtınızı bulamadınız mı? İletişim sayfasından bize yazın, bir kişi yanıt verir. İletişim sayfası
Dökümüm yükleniyor mu?
Hayır. Dönüştürücü tarayıcınızda çalışır ve dökümü diskinizden parça parça okur; böylece döküm bilgisayarınızdan hiç çıkmaz. Masaüstü uygulaması ve komut satırı da bilgisayarınızda dönüştürür.
Döküm ne kadar büyük olabilir?
Dönüştürücü dökümün tamamını asla bellekte tutmaz: dosyayı aralıklar halinde iki kez okur ve betiği ilerledikçe yazar. Birkaç gigabaytlık dökümler tarayıcıda, masaüstü uygulamasında ve komut satırıyla dönüştürülür.
pg_dump -Fc arşivlerini okuyor mu?
Doğrudan değil: custom arşiv ikili bir biçimdir. pg_restore -f dump.sql dump.backup, bir sunucuya bağlanmadan onu dönüştürücünün okuduğu düz SQL'e çevirir. Dönüştürücü bir arşiv aldığında bunu söyler.
Döküm hangi PostgreSQL sürümlerinden gelebilir?
PostgreSQL 10 ve sonrasından pg_dump ve pg_dumpall ile yazılmış, COPY veya INSERT satırları içeren dökümler. Her test dökümü PostgreSQL 13 ve 18'den gelir ve kaynağıyla hücre hücre karşılaştırılır.
serial ve identity değerleri korunuyor mu?
Evet. Her tablonun serial veya identity sütunu bir IDENTITY sütunu olur, her satır kendi id'sini korur ve sonraki id en yüksek id'den sonra devam eder. SQL Server tablo başına tek sütun sayar, bu yüzden diğerleri değerlerini sayaçsız korur.
Diziler, enum'lar ve diğer PostgreSQL türleri ne olur?
Diziler JSON dizisi, boolean'lar bit, uuid uniqueidentifier, saat dilimli timestamp'ler datetimeoffset olur. Metin PostgreSQL'deki gibi tam karşılaştırılır, citext ise büyük/küçük harfi yok sayar. Range'ler, geometrik türler ve bileşik türler PostgreSQL'in metnini korur.
Fonksiyonlar, tetikleyiciler ve görünümler ne olur?
Raporda adlarıyla listelenirler ve dönüştürülmezler, çünkü her veritabanı onları kendi dilinde yazar.
Betik hangi SQL Server sürümlerinde yüklenir?
SQL Server 2017 ile 2025 arası. Aynı betik her birinde yüklenir ve bir sorun çıkarsa ilk hatada durur.