Bạn sẽ có thể tìm thấy một số thông tin hữu ích trong câu trả lời được chấp nhận trong trang Serverfault này:https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql- 2005.
Nếu bạn có thể chuyển đổi lược đồ mà không có dữ liệu, bạn có thể rút ngắn các bước cho dữ liệu bằng cách sử dụng lệnh sau:
pg_dump --data-only --column-inserts your_db_name > data_load_script.sql
Quá trình tải này sẽ khá chậm, nhưng --column-inserts
tùy chọn tạo các câu lệnh INSERT chung nhất có thể cho mỗi hàng dữ liệu và phải tương thích.
CHỈNH SỬA:Các đề xuất về chuyển đổi giản đồ sau:
Tôi sẽ bắt đầu bằng cách kết xuất lược đồ, nhưng xóa bất kỳ thứ gì liên quan đến quyền sở hữu hoặc quyền. Điều này là đủ:
pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql
Chỉnh sửa tệp này để thêm dòng BEGIN TRANSACTION;
ở phần đầu và ROLLBACK TRANSACTION;
đến cuối cùng. Bây giờ bạn có thể tải nó và chạy nó trong cửa sổ truy vấn trong SQL Server. Nếu bạn gặp bất kỳ lỗi nào, hãy đảm bảo rằng bạn đi đến cuối tệp, đánh dấu câu lệnh ROLLBACK và chạy nó (bằng cách nhấn F5 trong khi câu lệnh được đánh dấu).
Về cơ bản, bạn phải giải quyết từng lỗi cho đến khi tập lệnh chạy hoàn toàn. Sau đó, bạn có thể thay đổi ROLLBACK TRANSACTION
sang COMMIT TRANSACTION
và chạy lần cuối.
Thật không may, tôi không thể giúp bạn về những lỗi nào mà bạn có thể gặp vì tôi chưa bao giờ chuyển từ PostgreSQL sang SQL Server, chỉ có điều ngược lại. Tuy nhiên, một số điều mà tôi mong đợi sẽ là một vấn đề (hiển nhiên, KHÔNG phải là một danh sách đầy đủ):
- PostgreSQL tự động tăng các trường bằng cách liên kết
NOT NULL INTEGER
trường tới mộtSEQUENCE
sử dụngDEFAULT
. Trong SQL Server, đây làIDENTITY
nhưng chúng không hoàn toàn giống nhau. Tôi không chắc liệu chúng có tương đương hay không, nhưng nếu lược đồ ban đầu của bạn chứa đầy các trường "id", bạn có thể gặp một số rắc rối. Tôi không biết liệu SQL Server cóCREATE SEQUENCE
hay không , vì vậy bạn có thể phải xóa chúng. - Chức năng cơ sở dữ liệu / Thủ tục được lưu trữ không dịch giữa các nền tảng RDBMS. Bạn sẽ cần xóa mọi
CREATE FUNCTION
các câu lệnh và dịch thuật toán theo cách thủ công. - Hãy cẩn thận về việc mã hóa tệp dữ liệu. Tôi là một người dùng Linux, vì vậy tôi không biết cách xác minh mã hóa trong Windows, nhưng bạn cần đảm bảo rằng những gì SQL Server mong đợi giống với tệp bạn đang nhập từ PostgreSQL.
pg_dump
có một tùy chọn--encoding=
điều đó sẽ cho phép bạn đặt một mã hóa cụ thể. Dường như tôi nhớ lại rằng Windows có xu hướng sử dụng mã hóa UTF-16 hai byte cho Unicode trong đó PostgreSQL sử dụng UTF-8. Tôi đã gặp một số vấn đề khi chuyển từ SQL Server sang PostgreSQL do đầu ra UTF-16 nên rất đáng để nghiên cứu. - Kiểu dữ liệu PostgreSQL
TEXT
chỉ đơn giản là mộtVARCHAR
không có độ dài tối đa. Trong SQL Server,TEXT
là ... phức tạp (và không được dùng nữa). Mỗi trường trong lược đồ ban đầu của bạn được khai báo làTEXT
sẽ cần được xem xét để có kiểu dữ liệu SQL Server thích hợp. - SQL Server có các kiểu dữ liệu bổ sung cho
UNICODE
dữ liệu. Tôi không đủ quen thuộc với nó để đưa ra đề xuất. Tôi chỉ chỉ ra rằng đó có thể là một vấn đề.