2009-08-26 23 views
15

Tôi đang cố đồng bộ hóa các lược đồ giữa các cơ sở dữ liệu khác nhau. Về cơ bản, tôi chạy các nhiệm vụ-> Tạo các kịch bản với SQL Server Management Studio (2005) trên cả hai cơ sở dữ liệu và đang so sánh đầu ra với một công cụ khác.Kiểm tra máy chủ SQL/chênh lệch NoCheck trong tập lệnh được tạo

Đối với một số lý do, một trong những kịch bản cho biết thêm các hạn chế WITH CHECK và một VỚI KHÔNG KIỂM TRA, tiếp theo là cả những hạn chế được tái kích hoạt.

Tôi cho cơ sở dữ liệu đầu tiên tôi nhận được:

ALTER TABLE [dbo].[Profile] WITH CHECK ADD CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID]) 
REFERENCES [dbo].[Organization] ([OrganizationID]) 
GO 
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID] 
GO 

Cơ sở dữ liệu thứ hai tạo ra như

ALTER TABLE [dbo].[Profile] WITH NOCHECK ADD CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID]) 
REFERENCES [dbo].[Organization] ([OrganizationID]) 
GO 
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID] 
GO 

Vì vậy, tôi có hai câu hỏi:

  1. là cuối cùng cho kết quả như nhau ? (Edit: Dường như rất nhiều người dân đang nhặt trên chỉ là tuyên bố đầu tiên của hai kịch bản Tôi quan tâm đến kết quả cuối cùng của toàn bộ của cả hai kịch bản..)

  2. Nếu cuối cùng kết quả là như nhau, tại sao Management Studio tạo ra chúng khác nhau cho các cơ sở dữ liệu khác nhau?

Trả lời

16

Kết quả cuối cùng không giống nhau!

Máy chủ SQL sẽ không tin tưởng tính duy nhất của FK là nó không được chọn. Điều này có nghĩa là xử lý bổ sung là bắt buộc nếu bạn sử dụng cột trong truy vấn.
Ngắn câu chuyện ngắn là bạn sẽ nhận được SQL Server để kiểm tra cột để nó được coi là đáng tin cậy.

Đối với lý do tại sao chúng khác với các máy chủ khác nhau, hãy kiểm tra cột isnottrusted trong sys.foreign_keys. Điều này có thể ảnh hưởng đến những gì SSMS được tạo ra?

Để biết thêm chi tiết về điều này, hãy kiểm tra my other answer liên quan đến các tùy chọn FK & KHÔNG CHECK/CHECK.

+0

Tuy nhiên, nếu bạn nhìn vào hai kịch bản lệnh, ngay sau khi thêm ràng buộc, có ALTER TABLE [ dbo]. [Hồ sơ] KIỂM TRA CONSTRAINT [FK_Profile_OrganizationID] GO Không kiểm tra các ràng buộc tại điểm đó? – Nathan

+0

Đối với phần thứ hai của câu trả lời của bạn, bạn thực sự đúng là is_not_trusted được đặt trên một trong các cơ sở dữ liệu, chứ không phải trên cơ sở dữ liệu khác. Điều này có ảnh hưởng gì? – Nathan

+2

Tìm thấy bài viết này: http://sqlblog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints.aspx Vì vậy, có vẻ như câu lệnh thứ hai trong lô chỉ đảm bảo rằng ràng buộc được bật, nó không thực sự kiểm tra dữ liệu hiện có. Để thực sự kiểm tra dữ liệu hiện có, tôi cần ALTER TABLE? VỚI KIỂM TRA KIỂM TRA KIỂM TRA tất cả các – Nathan

11

Có họ hai kịch bản khác nhau

WITH CHECK sẽ kiểm tra dữ liệu hiện chống lại các hạn chế mới.
VỚI NOCHECK sẽ không kiểm tra dữ liệu hiện có dựa trên ràng buộc mới. Điều này sẽ cho phép bạn có hồ sơ trẻ em mà không có cha mẹ tương ứng.

EDIT: Còn về lý do SSMS được làm điều này tôi không có ý tưởng

+1

Tuy nhiên, nếu bạn nhìn vào hai tập lệnh script, ngay sau khi thêm ràng buộc, có ALTER TABLE [dbo]. [Hồ sơ] KIỂM TRA CONSTRAINT [FK_Profile_OrganizationID] GO Không kiểm tra các ràng buộc tại điểm đó? – Nathan

0

Cả hai đều là SQL Server 2005 máy chủ? Kết quả là như vậy, công cụ tạo mã có thể sử dụng các thói quen khác nhau dựa trên các phiên bản khác nhau của sản phẩm

+0

Trên thực tế, tại thời điểm này, cả hai cơ sở dữ liệu trên cùng một máy chủ - vì vậy chắc chắn không có bất kỳ sự khác biệt nào về phiên bản Sql Server – Nathan

Các vấn đề liên quan