ALTER BẢNG KIỂM TRA CONSTRAINT


25

Từ Object Explorer trong SQL Server, khi chọn và kịch bản một ràng buộc khóa ngoài, đoạn mã sau được tạo.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Mục đích của tuyên bố cuối cùng "ALTER TABLE KIỂM TRA CONSTRAINT" là gì? Nó dường như không quan trọng cho dù nó có chạy hay không. Nó không thất bại trên dữ liệu xấu hiện tại và cũng không thay đổi rằng ràng buộc sẽ được thực thi trên dữ liệu mới.

Cảm ơn!

Câu trả lời:


23

Nó đảm bảo rằng các ràng buộc được kích hoạt sau khi nó được tạo. ALTER TABLETuyên bố của bạn bao gồm WITH NOCHECKphần nào nói rằng không kiểm tra dữ liệu xấu hiện có trong quá trình tạo ràng buộc.

Như được viết, dữ liệu hiện tại sẽ không được kiểm tra đối với các ràng buộc vì WITH NOCHECKtrong câu lệnh đầu tiên. Việc đưa ra câu lệnh thứ hai sẽ cho phép kiểm tra đối với các ràng buộc đối với bất kỳ thay đổi nào trong tương lai đối với bảng được bao phủ bởi các ràng buộc đó, cho đến khi một điểm ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]được ban hành.

Các báo cáo, như được viết, về cơ bản là nói "Tạo ràng buộc khóa ngoại này nhưng không kiểm tra nó dựa trên dữ liệu hiện có. Làm cho nó hoạt động cho bất kỳ thay đổi nào sắp tới đối với dữ liệu."


Trên thực tế tôi đã kiểm tra rằng, nó không tạo ra sự khác biệt nếu có dữ liệu xấu, dòng đầu tiên hoặc thứ hai sẽ không thất bại. Để thực hiện với một lần thất bại, họ sẽ phải trông như thế này:
Delux

2
ALTER TABLE [dbo]. [T2] VỚI KIỂM TRA KIỂM TRA CONSTRAINT [FK_T2_T1]
Delux

Đúng. Nhưng bạn sẽ thấy nó thất bại sau đó khi tại một thời điểm nào đó, bạn cố gắng chạy một CHERTN hoặc CẬP NHẬT vi phạm các ràng buộc. Sẽ không thất bại nếu dữ liệu xấu tồn tại tại thời điểm 2 câu lệnh đó được thực thi.
squillman

7

Tuyên bố đầu tiên của bạn tạo ra một ràng buộc bị vô hiệu hóa. Nó cần phải được kích hoạt và có thể đáng tin cậy. Cú pháp lạ sau đây sẽ đảm bảo ràng buộc của bạn được kích hoạt và tin cậy:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Có một bài viết rất hay của Hugo Kornelis giải thích nó rất chi tiết: Bạn có thể tin tưởng vào những hạn chế của bạn

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.