Chuyển SQL Server sang PostgreSQL
Thả tập lệnh mà Generate Scripts của SSMS ghi với schema và dữ liệu, dạng .sql hoặc .sql.gz, UTF-16 hoặc UTF-8, và tải xuống tập lệnh PostgreSQL với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị PostgreSQL không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.
Đã chuyển đổi 18 hàng, 3 bản sửa, không hàng nào bị từ chối
Các bảng trong shop_2024_sqlserver.sqlBản dump SQL Server · do SQL Server Management Objects ghi · utf-8
orders10 hàng2
11 cột id integer not null customer_id integer not null status varchar(10) not null total numeric(19,4) not null items smallint not null ordered_at timestamp(0) not null shipped_at timestamp(6) note text details text order_ref uuid not null total_with_tax numeric(12,2) customers8 hàng1
8 cột id integer not null name varchar(100) not null email varchar(200) not null country varchar(2) not null is_active boolean not null signed_up date created_at timestamptz(0) not null row_version bytea
Không được chuyển đổi
- Khung nhìn paid_orders
- Trình kích hoạt orders_no_negative
Mỗi cơ sở dữ liệu viết các đối tượng này bằng ngôn ngữ riêng. Hãy viết lại chúng cho PostgreSQL.
-- Written by IntoSQL from a SQL Server dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';
CREATE TABLE orders (
id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
customer_id integer NOT NULL,
status varchar(10) DEFAULT 'pending' NOT NULL,
total numeric(19,4) NOT NULL,
items smallint DEFAULT 1 NOT NULL,
ordered_at timestamp(0) NOT NULL,
shipped_at timestamp(6),
note text,
details text,
order_ref uuid DEFAULT (gen_random_uuid()::text) NOT NULL,
total_with_tax numeric(12,2) GENERATED ALWAYS AS ((cast(total * (1.16) AS numeric(12,2)))::numeric(12,2)) STORED,
CONSTRAINT orders_items_check CHECK (items >= 0),
CONSTRAINT orders_check2 CHECK (status = 'cancelled' OR status = 'shipped' OR status = 'paid' OR status = 'pending'),
CONSTRAINT orders_check3 CHECK (total >= (0))
);
CREATE TABLE customers (
id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name varchar(100) NOT NULL,
email varchar(200) NOT NULL,
country varchar(2) DEFAULT 'US' NOT NULL,
is_active boolean DEFAULT true NOT NULL,
signed_up date,
created_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
row_version bytea
);
COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1 Ana Martínez ana@example.com MX t 2023-01-15 2023-01-15 10:24:00.000000+00:00
2 Zoë Müller zoe@example.de DE t 2023-02-03 2023-02-03 08:11:42.000000+00:00
3 José Peña jose@example.es ES f 2023-03-21 2023-03-21 19:05:17.000000+00:00
4 李雷 lilei@example.cn CN t 2023-05-09 2023-05-09 02:40:00.000000+00:00
5 Noah O'Brien noah@example.ie IE t \N 2023-06-30 14:00:00.000000+00:00
6 Amélie Laurent amelie@example.fr FR t 2024-01-02 2024-01-02 09:30:00.000000+00:00
7 Ravi Patel ravi@example.in IN f 2024-02-29 2024-02-29 23:59:59.000000+00:00
8 Sofia Rossi 🌻 sofia@example.it IT t 2024-04-12 2024-04-12 12:12:12.000000+00:00
\.
COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) FROM stdin;
1 1 shipped 129.9000 3 2024-03-01T10:00:00.000000 2024-03-02T16:30:00.123456 \N {"gift": false} 0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f
2 2 paid 54.0000 1 2024-03-02T11:15:00.000000 \N Gift wrap 🎁 {"gift": true, "wrap": "red"} 1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70
3 1 cancelled 12.5000 1 2024-03-03T09:45:00.000000 \N Customer changed their mind \N 2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081
4 4 shipped 980.0000 12 2024-03-05T02:10:00.000000 2024-03-07T08:00:00.000000 请小心轻放 {"fragile": true} 3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192
5 5 pending 45.7500 2 2024-03-08T17:20:00.000000 \N Leave at the door; ring twice \N 4f1e806c-7d5b-4c2e-9a99-5e6f708192a3
6 6 shipped 310.4000 5 2024-03-10T13:00:00.000000 2024-03-11T09:00:00.000000 Fragile: "glass" {"fragile": true} 50f2917d-8e6c-4d3f-8baa-6f708192a3b4
7 8 paid 76.2000 2 2024-03-11T18:45:00.000000 \N \N \N 6103a28e-9f7d-4e40-9cbb-708192a3b4c5
8 2 shipped 19.9900 1 2024-03-12T08:00:00.000000 9999-12-31T23:59:59.999999 Shipped date set to the maximum by an old import \N 7214b39f-a08e-4f51-8dcc-8192a3b4c5d6
9 3 shipped 64.0000 2 2024-03-14T15:30:00.000000 2024-03-15T10:00:00.000000 Two parcels {"parcels": [1, 2]} 8325c4a0-b19f-4062-9edd-92a3b4c5d6e7
10 7 paid 1499.0000 1 2024-03-15T21:05:00.000000 \N C:\\Users\\ravi\\invoice.pdf \N 9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8
\.
-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX customers_email ON customers (email);
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_email UNIQUE USING INDEX customers_email;
ALTER TABLE orders ADD CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
ALTER TABLE orders VALIDATE CONSTRAINT orders_fkey;
EXCEPTION WHEN foreign_key_violation THEN
RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_fkey';
END $f$;
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
Bản sửa
- "items" của orders là số không dấu, nên được chuyển thành smallint kèm ràng buộc kiểm tra không âm.
- "shipped_at" của orders là datetime2(7), có nhiều chữ số của giây hơn mức PostgreSQL giữ được, nên nó là timestamp(6) và các chữ số cuối bị cắt.
- "row_version" của customers là phiên bản hàng do SQL Server tự đặt; bản dump không có giá trị cho nó, nên nó là bytea và để trống.
Cần xem lại
- 6 cột văn bản trong nguồn so sánh không phân biệt hoa thường; PostgreSQL so sánh chính xác, nên khóa duy nhất và tìm kiếm có thể hoạt động khác. Hãy dùng một collation hoặc kiểu cột không phân biệt hoa thường cho các cột cần điều đó.
- 2 khung nhìn, trình kích hoạt, thủ tục hoặc sự kiện không được chuyển đổi; báo cáo liệt kê từng mục. Hãy tạo lại chúng thủ công trong PostgreSQL.
- Ràng buộc kiểm tra check1 trên orders không viết được cho PostgreSQL (function isjson), nên không được tạo. Hãy viết ràng buộc kiểm tra thủ công nếu nó quan trọng.
- Chỉ mục idx_orders_pending trên orders dùng một biểu thức không viết được cho PostgreSQL (filtered index), nên không được tạo. Hãy tạo chỉ mục thủ công nếu truy vấn cần nó.
Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.
Mẫu khác:
Những gì thay đổi từ SQL Server sang PostgreSQL
Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.
bit
boolean
bit chứa 1 và 0, chính là true và false của PostgreSQL.
tinyint
smallint kèm CHECK không âm
tinyint của SQL Server chạy từ 0 đến 255; số nguyên nhỏ nhất của PostgreSQL có dấu, nên ràng buộc kiểm tra giữ phạm vi của nó.
Dòng báo cáo: unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text
varchar(n) và text
Văn bản của PostgreSQL chứa mọi ký tự, nên varchar và nvarchar là cùng một kiểu.
decimal(p,s), money, smallmoney
numeric(p,s); money thành numeric(19,4)
Mọi chữ số được giữ, money với bốn chữ số thập phân.
datetime, datetime2, smalldatetime
timestamp(p)
datetime là thời gian theo đồng hồ, giống timestamp không có múi giờ.
datetime2(7), time(7) and datetimeoffset(7)
sáu chữ số của giây, chữ số thứ bảy bị cắt
PostgreSQL giữ đến micro giây; chữ số thứ bảy (100 nano giây) bị cắt, không bao giờ làm tròn, nên không giá trị nào nhảy sang giây hay ngày kế tiếp.
Dòng báo cáo: fraction_cut
datetimeoffset
timestamptz, cùng các thời điểm
timestamptz giữ thời điểm; PostgreSQL hiển thị nó theo múi giờ của phiên thay vì độ lệch mà mỗi giá trị có.
time
time(p)
Cùng các giờ trong ngày.
json (SQL Server 2025)
jsonb
Cùng các giá trị JSON.
uniqueidentifier
uuid
Cùng các định danh, viết bằng chữ thường.
binary, varbinary, image
bytea
Byte vẫn là byte.
geometry, geography
bytea với byte riêng của SQL Server
SSMS ghi giá trị không gian theo định dạng tuần tự hóa riêng của SQL Server, được giữ nguyên từng byte.
Dòng báo cáo: spatial_as_native
rowversion, timestamp
bytea, để trống
SQL Server tự đặt phiên bản hàng và SSMS không ghi giá trị cho nó.
Dòng báo cáo: rowversion_empty
sql_variant, hierarchyid, vector
text
PostgreSQL không có kiểu tương đương; sql_variant giữ văn bản của từng giá trị và hierarchyid giữ đường dẫn của nó, ví dụ /1/2/. xml vẫn là xml.
Dòng báo cáo: type_replaced
collations that ignore case (_CI_)
so sánh chính xác
PostgreSQL so sánh văn bản chính xác, nên cột từng không phân biệt hoa thường trong SQL Server giờ phân biệt Ana và ana.
Dòng báo cáo: case_insensitive_collation
IDENTITY
GENERATED BY DEFAULT AS IDENTITY, tiếp tục sau id lớn nhất
Các id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất.
CREATE SEQUENCE
CREATE SEQUENCE với cùng các tùy chọn
Sequence của PostgreSQL hoạt động giống vậy. SSMS không ghi sequence đã chạy đến đâu, nên nó bắt đầu từ điểm lúc được tạo.
computed columns
cột tính toán, STORED
PostgreSQL 13 đến 17 chỉ lưu cột tính toán; công thức giữ nguyên, với CONCAT được viết để NULL được tính là rỗng như trong SQL Server.
Dòng báo cáo: virtual_as_stored
computed columns with functions PostgreSQL lacks
một cột thường
Công thức không viết được cho PostgreSQL để lại một cột thường và một dòng trong báo cáo; SSMS không ghi giá trị cho cột tính toán.
Dòng báo cáo: generated_not_translated
defaults with functions PostgreSQL lacks, and NEXT VALUE FOR
không có giá trị mặc định
Giá trị mặc định không viết được cho PostgreSQL sẽ bị bỏ và được báo cáo.
Dòng báo cáo: default_not_translated
CHECK constraints
được chuyển đổi
Cùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.
CHECK constraints with functions PostgreSQL lacks
không được tạo
Ràng buộc kiểm tra không viết được cho PostgreSQL sẽ bị bỏ và được báo cáo.
Dòng báo cáo: check_skipped
CHECK constraints added WITH NOCHECK or disabled
không được tạo
SQL Server không áp dụng các ràng buộc kiểm tra này, nên các hàng có thể vi phạm chúng.
Dòng báo cáo: check_not_enforced
filtered and columnstore indexes
không được tạo
IntoSQL ghi chỉ mục b-tree trên cột; hãy tạo lại các chỉ mục khác sau khi nạp.
Dòng báo cáo: index_skipped
foreign keys
khóa ngoại, sau các hàng
Các hàng được nạp theo thứ tự bất kỳ, và khóa kiểm tra chúng sau đó.
foreign keys to tables the dump doesn't create
không được tạo
Khóa không thể tham chiếu tới bảng không tồn tại.
Dòng báo cáo: foreign_key_skipped
tables on a partition scheme
một bảng chứa các hàng của mọi phân vùng
Các hàng giữ nguyên; hãy phân vùng lại bảng trong PostgreSQL nếu cần.
Dòng báo cáo: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
hai bảng: các hàng hiện tại và lịch sử
Bảng và bảng lịch sử của nó được sao chép thành bảng thường; PostgreSQL không tự giữ lịch sử.
Dòng báo cáo: system_versioning_dropped
NOT NULL columns with values that become NULL
bỏ NOT NULL
Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.
Dòng báo cáo: not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functions
được liệt kê trong báo cáo
Mã của chúng viết bằng T-SQL, nên được liệt kê để bạn tạo lại.
Dòng báo cáo: not_converted_objects
scripts without CREATE TABLE (data only)
kiểu suy ra từ giá trị
Tập lệnh chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.
Dòng báo cáo: no_schema
expressions in INSERT values
NULL
Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.
Dòng báo cáo: expression_value
types IntoSQL doesn't know
text
Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.
Dòng báo cáo: unknown_type
dates that aren't valid
NULL
Giá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.
Dòng báo cáo: date_out_of_range
NUL characters in text
bị xóa
Văn bản PostgreSQL không chứa được ký tự NUL. Ký tự này bị xóa và báo cáo đếm các giá trị.
Dòng báo cáo: nul_removed
text that isn't valid in its encoding
byte lỗi thành ký tự thay thế
Văn bản PostgreSQL phải là UTF-8 hợp lệ.
Dòng báo cáo: invalid_utf8_replaced
text decoded twice (ñ)
sao chép nguyên trạng
Tập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.
Dòng báo cáo: mojibake_suspected
| Trong SQL Server | Trong PostgreSQL | Dòng báo cáo |
|---|---|---|
| bit | booleanbit chứa 1 và 0, chính là true và false của PostgreSQL. | |
| tinyint | smallint kèm CHECK không âmtinyint của SQL Server chạy từ 0 đến 255; số nguyên nhỏ nhất của PostgreSQL có dấu, nên ràng buộc kiểm tra giữ phạm vi của nó. | unsigned_widened |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | varchar(n) và textVăn bản của PostgreSQL chứa mọi ký tự, nên varchar và nvarchar là cùng một kiểu. | |
| decimal(p,s), money, smallmoney | numeric(p,s); money thành numeric(19,4)Mọi chữ số được giữ, money với bốn chữ số thập phân. | |
| datetime, datetime2, smalldatetime | timestamp(p)datetime là thời gian theo đồng hồ, giống timestamp không có múi giờ. | |
| datetime2(7), time(7) and datetimeoffset(7) | sáu chữ số của giây, chữ số thứ bảy bị cắtPostgreSQL giữ đến micro giây; chữ số thứ bảy (100 nano giây) bị cắt, không bao giờ làm tròn, nên không giá trị nào nhảy sang giây hay ngày kế tiếp. | fraction_cut |
| datetimeoffset | timestamptz, cùng các thời điểmtimestamptz giữ thời điểm; PostgreSQL hiển thị nó theo múi giờ của phiên thay vì độ lệch mà mỗi giá trị có. | |
| time | time(p)Cùng các giờ trong ngày. | |
| json (SQL Server 2025) | jsonbCùng các giá trị JSON. | |
| uniqueidentifier | uuidCùng các định danh, viết bằng chữ thường. | |
| binary, varbinary, image | byteaByte vẫn là byte. | |
| geometry, geography | bytea với byte riêng của SQL ServerSSMS ghi giá trị không gian theo định dạng tuần tự hóa riêng của SQL Server, được giữ nguyên từng byte. | spatial_as_native |
| rowversion, timestamp | bytea, để trốngSQL Server tự đặt phiên bản hàng và SSMS không ghi giá trị cho nó. | rowversion_empty |
| sql_variant, hierarchyid, vector | textPostgreSQL không có kiểu tương đương; sql_variant giữ văn bản của từng giá trị và hierarchyid giữ đường dẫn của nó, ví dụ /1/2/. xml vẫn là xml. | type_replaced |
| collations that ignore case (_CI_) | so sánh chính xácPostgreSQL so sánh văn bản chính xác, nên cột từng không phân biệt hoa thường trong SQL Server giờ phân biệt Ana và ana. | case_insensitive_collation |
| IDENTITY | GENERATED BY DEFAULT AS IDENTITY, tiếp tục sau id lớn nhấtCác id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất. | |
| CREATE SEQUENCE | CREATE SEQUENCE với cùng các tùy chọnSequence của PostgreSQL hoạt động giống vậy. SSMS không ghi sequence đã chạy đến đâu, nên nó bắt đầu từ điểm lúc được tạo. | |
| computed columns | cột tính toán, STOREDPostgreSQL 13 đến 17 chỉ lưu cột tính toán; công thức giữ nguyên, với CONCAT được viết để NULL được tính là rỗng như trong SQL Server. | virtual_as_stored |
| computed columns with functions PostgreSQL lacks | một cột thườngCông thức không viết được cho PostgreSQL để lại một cột thường và một dòng trong báo cáo; SSMS không ghi giá trị cho cột tính toán. | generated_not_translated |
| defaults with functions PostgreSQL lacks, and NEXT VALUE FOR | không có giá trị mặc địnhGiá trị mặc định không viết được cho PostgreSQL sẽ bị bỏ và được báo cáo. | default_not_translated |
| CHECK constraints | được chuyển đổiCùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp. | |
| CHECK constraints with functions PostgreSQL lacks | không được tạoRàng buộc kiểm tra không viết được cho PostgreSQL sẽ bị bỏ và được báo cáo. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | không được tạoSQL Server không áp dụng các ràng buộc kiểm tra này, nên các hàng có thể vi phạm chúng. | check_not_enforced |
| filtered and columnstore indexes | không được tạoIntoSQL ghi chỉ mục b-tree trên cột; hãy tạo lại các chỉ mục khác sau khi nạp. | index_skipped |
| foreign keys | khóa ngoại, sau các hàngCác hàng được nạp theo thứ tự bất kỳ, và khóa kiểm tra chúng sau đó. | |
| foreign keys to tables the dump doesn't create | không được tạoKhóa không thể tham chiếu tới bảng không tồn tại. | foreign_key_skipped |
| tables on a partition scheme | một bảng chứa các hàng của mọi phân vùngCác hàng giữ nguyên; hãy phân vùng lại bảng trong PostgreSQL nếu cần. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | hai bảng: các hàng hiện tại và lịch sửBảng và bảng lịch sử của nó được sao chép thành bảng thường; PostgreSQL không tự giữ lịch sử. | system_versioning_dropped |
| NOT NULL columns with values that become NULL | bỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng. | not_null_relaxed |
| views, functions, procedures, triggers, synonyms, types and partition functions | được liệt kê trong báo cáoMã của chúng viết bằng T-SQL, nên được liệt kê để bạn tạo lại. | not_converted_objects |
| scripts without CREATE TABLE (data only) | kiểu suy ra từ giá trịTập lệnh chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị. | no_schema |
| expressions in INSERT values | NULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng. | expression_value |
| types IntoSQL doesn't know | textVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp. | unknown_type |
| dates that aren't valid | NULLGiá trị không phải ngày sẽ thành NULL và báo cáo đếm nó. | date_out_of_range |
| NUL characters in text | bị xóaVăn bản PostgreSQL không chứa được ký tự NUL. Ký tự này bị xóa và báo cáo đếm các giá trị. | nul_removed |
| text that isn't valid in its encoding | byte lỗi thành ký tự thay thếVăn bản PostgreSQL phải là UTF-8 hợp lệ. | invalid_utf8_replaced |
| text decoded twice (ñ) | sao chép nguyên trạngTập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng. | mojibake_suspected |
Nạp tập lệnh vào PostgreSQL
Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.
psql -v ON_ERROR_STOP=1 -d mydb -f sql_server.postgresql.sqlKhóa ngoại được thêm dưới dạng NOT VALID rồi được xác thực. Nếu một hàng trỏ tới hàng không tồn tại, tập lệnh cho bạn biết ràng buộc nào, thay vì thất bại giữa chừng.
Với bản dump lớn, hãy tạo cơ sở dữ liệu trước và chạy tập lệnh bằng psql trên cùng máy với máy chủ.
IntoSQL Pro nạp tệp thẳng vào PostgreSQL từ ứng dụng máy tính hoặc dòng lệnh, không cần tạo tập lệnh.
Tạo bản dump SQL Server để có kết quả tốt nhất
Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:
- Trong SSMS, nhấp chuột phải vào cơ sở dữ liệu, Tasks, Generate Scripts, rồi chọn các bảng. dbatools, mssql-scripter và các công cụ khác dựng trên cùng thư viện ghi ra cùng một tập lệnh.
- Trong Advanced, đặt Types of data to script thành Schema and data. Tập lệnh chỉ có schema sẽ có bảng mà không có hàng.
- Lưu dưới dạng Unicode, mặc định của SSMS, hoặc UTF-8: cả hai đều được đọc như nhau, và gzip cũng được.
Những gì không được chuyển đổi
Khung nhìn, hàm, thủ tục, trình kích hoạt, từ đồng nghĩa, quy tắc và chính sách bảo mật được viết bằng T-SQL. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho PostgreSQL.
Câu hỏi về SQL Server sang PostgreSQL
Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ
Bản dump của tôi có bị tải lên không?
Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.
Bản dump có thể lớn đến đâu?
Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.
Nó có đọc được tệp UTF-16 mà SSMS lưu không?
Có. SSMS lưu tập lệnh dạng UTF-16 theo mặc định, và trình chuyển đổi đọc UTF-16 và UTF-8 như nhau, có nén gzip hay không, với GO giữa các lô.
Tập lệnh có thể đến từ những phiên bản SQL Server nào?
Tập lệnh do SSMS, dbatools hoặc mssql-scripter ghi từ SQL Server 2017 trở lên. Mọi tập lệnh thử nghiệm đến từ SQL Server 2017, 2022 và 2025 và được so với nguồn từng ô một.
Giá trị IDENTITY có được giữ không?
Có. Cột IDENTITY trở thành cột identity, mọi hàng giữ id của nó, và id tiếp theo tiếp tục sau id lớn nhất. Sequence được tạo với cùng các tùy chọn.
money, datetimeoffset và các kiểu SQL Server khác sẽ ra sao?
bit thành boolean, money thành numeric(19,4), uniqueidentifier thành uuid, xml giữ xml, và datetimeoffset thành timestamptz. datetime2 giữ sáu chữ số của giây, chữ số thứ bảy bị cắt. Cột từng không phân biệt hoa thường sẽ so sánh chính xác, và báo cáo cho biết những cột nào.
Còn thủ tục, trình kích hoạt và khung nhìn thì sao?
Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng.
Tập lệnh nạp được trên những phiên bản PostgreSQL nào?
PostgreSQL 13 đến 18. Cùng một tập lệnh nạp được trên từng phiên bản, và dừng ở lỗi đầu tiên nếu có sự cố.