Làm thế nào tôi có thể so sánh lược đồ của hai cơ sở dữ liệu?


19

Có cách nào để tìm sự khác biệt trong hai cơ sở dữ liệu SQL Server (chỉ lược đồ). Một là địa phương và thứ hai là tại một trang web của khách hàng. Chúng tôi đang gặp vấn đề với các báo cáo tinh thể chạy một số báo cáo và một số mã không thực thi và có vẻ như các lược đồ không khớp.

Tôi có thể chạy cùng một lệnh trên cả hai cơ sở dữ liệu và so sánh kết quả để cho biết sự khác biệt ở đâu không?


Câu hỏi này về SO có một số gợi ý tốt.
LowlyDBA

Câu trả lời:


13

Nếu bạn không thể sử dụng một trong nhiều công cụ ngoài đó vì vấn đề kết nối và muốn so sánh "ngoại tuyến", bạn có thể sử dụng SSMS để tạo tập lệnh cho tất cả các đối tượng cơ sở dữ liệu bằng cách nhấp chuột phải vào cơ sở dữ liệu và sử dụng "Nhiệm vụ ... / Tạo" Chức năng tập lệnh "và đảm bảo bạn chọn tạo một tệp cho mỗi đối tượng.

Khi bạn đã thực hiện điều đó cho cả hai cơ sở dữ liệu, hãy lấy hai bộ tập lệnh vào một máy cục bộ trong hai thư mục riêng biệt và sử dụng WinMerge (hoặc tương tự) để so sánh hai bộ.


6

Một tùy chọn khác là sử dụng SQL Server Data Tools (SSDT), một phần mở rộng của Visual Studio. Bạn có thể trích xuất lược đồ cơ sở dữ liệu của mình dưới dạng tệp .dacpac và so sánh tệp đó với tệp .dacpac khác hoặc cơ sở dữ liệu hiện có. SSDT được bao gồm với các công cụ máy khách SQL Server 2012, làm cho nó dễ truy cập. Bạn có thể tìm thấy các hướng dẫn đầy đủ về cách chạy so sánh trên trang web MSDN .


6

Sau khi vật lộn với một cách dễ dàng để thực hiện cùng một nhiệm vụ này - xem những gì đã thay đổi giữa 2 mô hình, tôi đã viết SQL Script sau đây sẽ so sánh hai lược đồ để xác định các cột mới và các cột bị xóa

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

Đối với một giải pháp nhanh chóng và bẩn thỉu không yêu cầu bất kỳ phần mềm bổ sung nào, điều này thật tuyệt! Đó chính xác là những gì tôi cần. Cảm ơn!
Mir

2

Nếu bạn cần so sánh nhiều hơn một tệp cơ sở dữ liệu, bạn có thể tạo tập lệnh SQLPackage.exe.

Tôi không có mã làm việc cho bạn nhưng bạn có thể xem tài liệu SQLPackage.exe để tìm cảm hứng.

Bạn sẽ trích xuất cơ sở dữ liệu chủ của mình sang tệp dacpac và sau đó so sánh tệp dacpac với phần còn lại của cơ sở dữ liệu của bạn. Kết quả so sánh có thể là một báo cáo xml về các thay đổi hoặc tệp .sql mà bạn có thể chạy để đồng bộ hóa cơ sở dữ liệu.

Một cái gì đó như thế này:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

và sau đó

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

Bạn có thể xem bài viết này hoặc bài viết này cho mã mẫu.


1

Thực hiện tìm kiếm "So sánh máy chủ SQL" và bạn sẽ tìm thấy rất nhiều công cụ. Công cụ chúng tôi sử dụng trong công việc của tôi là Red Gate SQLCompare . Nó có một thử nghiệm 14 ngày. Nhưng vì bạn đang nói về hai môi trường khác nhau, tôi không nghĩ rằng nó sẽ phù hợp với bạn, trừ khi khách hàng gửi cho bạn bản sao lưu DB của họ. Tùy chọn khác là viết các truy vấn đối với các bảng hệ thống (như sys.indexes, sys.tables, v.v.).


So sánh SQL hoạt động tốt nếu bạn có thông tin đăng nhập cho cả hai máy chủ. Bạn có thể sử dụng thông tin đăng nhập khác nhau cho mỗi DB, vì vậy khách hàng sẽ phải đảm bảo bạn có quyền truy cập.
Mark Sinkinson 14/03/2015

1

Cách dễ nhất là sử dụng một công cụ tự động được xây dựng cho mục đích này , nhưng nếu bạn không có quyền truy cập vào một công cụ, bạn có thể nhận được tất cả thông tin cơ bản mà bạn cần từ các INFORMATION_SCHEMAchế độ xem.

Sử dụng siêu dữ liệu trong INFORMATION_SCHEMAcó lẽ là một tùy chọn dễ dàng hơn so với việc tạo các tập lệnh DDL và thực hiện so sánh nguồn vì bạn có nhiều quyền kiểm soát hơn đối với cách trình bày dữ liệu. Bạn thực sự không thể kiểm soát thứ tự các tập lệnh được tạo sẽ trình bày các đối tượng trong cơ sở dữ liệu. Ngoài ra, các tập lệnh chứa một loạt văn bản có thể được triển khai theo mặc định và có thể gây ra nhiều "nhiễu" không phù hợp khi những gì bạn có thể thực sự cần tập trung vào là một bảng, dạng xem hoặc cột bị thiếu hoặc có thể là kiểu dữ liệu cột hoặc kích thước không phù hợp.

Viết một truy vấn (hoặc truy vấn) để lấy thông tin quan trọng đối với mã của bạn từ các INFORMATION_SCHEMAkhung nhìn và chạy nó trên mỗi Máy chủ SQL từ SSMS. Sau đó, bạn có thể kết xuất kết quả vào một tệp và sử dụng công cụ so sánh tệp văn bản (thậm chí MS Word) hoặc bạn có thể kết quả kết quả vào các bảng và chạy các truy vấn SQL để tìm sự không phù hợp.


1

Tôi bao gồm câu trả lời này vì một câu hỏi mới được đánh dấu là trùng lặp.

Tôi đã từng phải so sánh hai cơ sở dữ liệu sản xuất và tìm thấy bất kỳ sự khác biệt lược đồ nào giữa chúng. Các mục quan tâm duy nhất là các bảng đã được thêm hoặc xóa và các cột đã được thêm, xóa hoặc thay đổi. Tôi không còn có các tập lệnh SQL mà tôi đã phát triển, nhưng điều tiếp theo là chiến lược chung. Và cơ sở dữ liệu không phải là SQL Server, nhưng tôi nghĩ chiến lược tương tự cũng được áp dụng.

Đầu tiên, tôi đã tạo ra những gì tốt nhất có thể được mô tả như là một cơ sở dữ liệu. Các bảng người dùng của cơ sở dữ liệu này chứa các mô tả dữ liệu được sao chép từ các bảng hệ thống của cơ sở dữ liệu sản xuất. Những thứ như Tên bảng, Tên cột, Kiểu dữ liệu và Độ chính xác. Có một mục nữa, Tên cơ sở dữ liệu, không tồn tại trong một trong các cơ sở dữ liệu sản xuất.

Tiếp theo, tôi đã phát triển các tập lệnh kết hợp các lựa chọn từ các bảng hệ thống của cơ sở dữ liệu sản xuất với việc chèn vào các bảng người dùng của cơ sở dữ liệu metadatabase.

Cuối cùng, tôi đã phát triển các truy vấn để tìm các bảng tồn tại trong một cơ sở dữ liệu nhưng không phải các bảng khác và các cột từ các bảng trong cả hai cơ sở dữ liệu chỉ có trong một cơ sở dữ liệu và các cột có định nghĩa không thống nhất giữa hai cơ sở dữ liệu.

Trong số khoảng 100 bảng và 600 cột, tôi đã tìm thấy một số điểm không nhất quán và một cột được xác định là một dấu phẩy động trong một cơ sở dữ liệu và một số nguyên khác. Cái cuối cùng đó hóa ra là một ơn trời, bởi vì nó đã khai quật được một vấn đề đã gây khó chịu cho một trong những cơ sở dữ liệu trong nhiều năm.

Mô hình cho siêu dữ liệu được đề xuất bởi các bảng hệ thống được đề cập. Các truy vấn không khó để xây dựng, chủ yếu xoay quanh nhóm và có số lượng (tên cơ sở dữ liệu) = 1.

Trong trường hợp của bạn, với 700 cơ sở dữ liệu sản xuất, bạn có thể muốn tự động hóa hai bước đầu tiên nhiều hơn tôi đã làm chỉ với hai cơ sở dữ liệu để so sánh. Nhưng ý tưởng là tương tự.


1

Tôi đã có chính xác câu hỏi này và tôi tin rằng Microsoft SQL Server Management Studio (SSMS) có một giải pháp dễ dàng / đơn giản hơn nhiều so với bất cứ điều gì tôi thấy ở đây. Tôi có một trang sản xuất với MS SQL Server Express và sắp tới tôi sẽ không phải cài đặt VisualStudio hoặc các ứng dụng khác ngoài SSMS.

Vì vậy, trong SSMS, nhấp chuột phải vào cơ sở dữ liệu để lấy lược đồ cho. Chọn Nhiệm vụ> Tạo tập lệnh ... để mở trình hướng dẫn để kịch bản lược đồ và cấu hình cho toàn bộ cơ sở dữ liệu (hoặc các đối tượng được chọn nếu bạn muốn). Tôi giữ tất cả các tùy chọn mặc định ngoại trừ đường dẫn / tên tệp, nhưng công cụ có rất nhiều tùy chọn. Trình hướng dẫn đã tạo một SQL mà tôi đã sao chép qua OneDrive trở lại PC của mình. Sau đó, tôi đã sử dụng Notepad ++ để so sánh SQL với một tệp được tạo theo cùng cách với cơ sở dữ liệu SIT của tôi. Bạn phải lọc ra các lượt truy cập từ ngày / giờ trong các bình luận, nhưng nếu không thì đó là một so sánh tuyệt vời của hai cơ sở dữ liệu.

Mau! Viết cái này lên khó hơn đáng kể so với làm so sánh thực tế.


0

Một công cụ tuyệt vời tôi sử dụng (mặc dù không được cập nhật trong một thời gian vẫn hoạt động) là AdeptSqlDiff

Liệu cả hai lược đồ so sánh cũng như so sánh dữ liệu. Giống như RedGate có chi phí nhưng cũng có bản dùng thử 30 ngày. Và giá cả khá hợp lý.


0

Có lẽ kịch bản miễn phí này https://github.com/dlevsha/compalex có thể giúp bạn. Nó hỗ trợ Microsoft SQL Server.

Compalex là một kịch bản nhẹ miễn phí để so sánh hai lược đồ cơ sở dữ liệu. Nó hỗ trợ MySQL, MS SQL Server và PostgreSQL.

Bạn có thể thử demo tại đây

http://demo.compalex.net/


0

Có nhiều công cụ của bên thứ ba ngoài đó sẽ thực hiện so sánh lược đồ và dữ liệu và đồng bộ hóa. Hai công cụ bạn có thể sử dụng là những công cụ mà nhóm của tôi và tôi đã phát triển, xQuery Schema So sánh để so sánh lược đồ và So sánh dữ liệu xQuery để so sánh dữ liệu giữa các đối tượng có cùng lược đồ. Hi vọng điêu nay co ich!
Tuyên bố miễn trừ trách nhiệm: Tôi liên kết với xQuery


0

Có rất nhiều công cụ trên thị trường mà bạn có thể sử dụng để hoàn thành công việc. Công ty của tôi đang sử dụng ApexQuery Diff cho cả so sánh và đồng bộ hóa vì nó miễn phí cho Azure, nhưng bạn không thể sai với các công cụ Devart hoặc Redgate.


0

Tôi là một fan hâm mộ của SQL DBDiff , đây là một công cụ nguồn mở mà bạn có thể sử dụng để so sánh các bảng, khung nhìn, hàm, người dùng, v.v. của hai trường hợp cơ sở dữ liệu SQL Server và tạo tập lệnh thay đổi giữa cơ sở dữ liệu nguồn và đích.


0

Tôi đã tạo một tiện ích MssqlMerge cho phép so sánh các cơ sở dữ liệu MSSQL, cả cấu trúc và dữ liệu. Có một phiên bản miễn phí có sẵn cho phép so sánh các định nghĩa bảng, dạng xem, thủ tục được lưu trữ và các hàm. Ngoài ra, còn có phiên bản Pro hỗ trợ nhiều loại đối tượng hơn và có tính năng 'Truy vấn kết quả khác biệt' nơi bạn có thể chạy và so sánh bất kỳ kết quả truy vấn nào, bao gồm các truy vấn so với chế độ xem hệ thống, để so sánh một số chi tiết khác không có trong hộp.


-1

Kiểm tra này:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

nhập mô tả hình ảnh ở đây


3
Điều này thực sự cần phải được so sánh, không chỉ là lấy lược đồ
Mark Sinkinson

Tôi sẽ để nó ở đây, nó sẽ giúp người khác. Nó đã giúp tôi
Jeremy Thompson


-1

DBDiff là công cụ tốt nhất cho việc này, bạn có thể tìm thấy nó ở đây .


Chào mừng bạn đến với Quản trị viên Cơ sở dữ liệu! Như bạn thấy, tất cả các câu trả lời được đón nhận ở đây không chỉ là một liên kết . Vui lòng xem xét chỉnh sửa ing câu trả lời của bạn và thêm thông tin về phần mềm, đặc biệt là cách nó đáp ứng các yêu cầu trong câu hỏi.
Glorfindel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.