PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để di chuyển cơ sở dữ liệu PostgreSQL sang SQLServer?

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ột SEQUENCE sử dụng DEFAULT . 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ột VARCHAR 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 đề.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảo vệ sar (và cách cấu hình nó)

  2. Sử dụng đầu ra văn bản từ một hàm làm truy vấn mới

  3. Sự khác biệt giữa ngôn ngữ sql và ngôn ngữ plpgsql trong các hàm PostgreSQL

  4. Trả về 0 nếu không tìm thấy bản ghi

  5. Duy trì múi giờ ở loại timestamptz PostgreSQL