2012-03-15 29 views
5

Tôi rất mệt khi thêm Kiểm tra ràng buộc và tôi chỉ bị lỗi cho đến thời điểm này. Điều gì sẽ là cách để làm được việc này:Kiểm tra ràng buộc - Truy vấn phụ không được phép trong ngữ cảnh này

Msg 1046, Level 15, State 1, Line 6

các truy vấn con không được phép trong bối cảnh này. Chỉ cho phép biểu thức vô hướng .

Đây là mã:

ALTER TABLE dbo.PropertySeasonDiscount ADD CONSTRAINT 
[CC_PropertySeasonDiscount_MadeFrom_MadeTo] 
CHECK (
    (SELECT COUNT(PropertySeasonDiscountId) FROM dbo.PropertySeasonDiscounts apsdeb 
     WHERE 
      (apsdeb.PropertySeasonId = PropertySeasonId) AND 
      (
       (apsdeb.ValidForReservationsMadeTo >= ValidForReservationsMadeFrom AND ValidForReservationsMadeFrom >= apsdeb.ValidForReservationsMadeFrom) OR 
       (apsdeb.ValidForReservationsMadeFrom <= ValidForReservationsMadeTo AND ValidForReservationsMadeTo <= apsdeb.ValidForReservationsMadeTo) 
      ) 
    ) = 0 
); 
+0

Làm thế nào về một kích hoạt? –

+0

@AaronBertrand Tôi đặt logic bên trong UDF và trả về giá trị cho UDF đó. Sau đó, tôi so sánh với nó bên trong ràng buộc và nó không phàn nàn. Kích hoạt sẽ tốt hơn? – tugberk

+0

@AaronBertrand Nó không phàn nàn khi tôi tạo ra nhưng nó hoạt động bất ngờ khi tôi cố gắng thêm giá trị vào bảng. – tugberk

Trả lời

10

SQL Server hiện không support subqueries for CHECK CONSTRAINTs.

Như bạn đã khám phá, có thể có trouble with CHECK constraints liên quan đến UDF khi cố gắng phá vỡ giới hạn truy vấn con.

Chiến lược triển khai hạn chế thay thế là kích hoạt thủ tụcquy trình được nhúng. Cái cũ được ưa thích bởi vì, chung với các ràng buộc khai báo, chúng không thể bị phá vỡ.

Thực hiện chiến lược thủ tục được kích hoạt được tối ưu hóa tốt và xử lý các vấn đề đồng thời là không tầm thường nhưng vẫn có thể thực hiện được. Tôi rất khuyên bạn nên cuốn sách Applied Mathematics for Database Professionals By Lex de Haan, Toon Koppelaars, chương 11 (các ví dụ mã là Oracle nhưng có thể dễ dàng được chuyển đến SQL Server).

3

Như những người khác đã đề cập, loại ràng buộc kiểm tra này chưa được triển khai trong SQL-Server. Bên cạnh việc kích hoạt, bạn cũng có thể kiểm tra khả năng thay đổi thiết kế của bảng.

Một giải pháp thay thế có thể bao gồm lưu trữ ngày kết thúc trước đó trong mỗi hàng. Xem Storing intervals of time with no overlaps để biết chi tiết. Các ràng buộc thực thi rất đơn giản nhưng có những biến chứng về cách bạn sẽ phải đối phó với các Chèn/Xoá/Cập nhật trên bảng.

Một khả năng khác là lưu trữ không phải một hàng (với ngày bắt đầu và ngày kết thúc) để giảm giá như bạn làm ngay bây giờ nhưng toàn bộ hàng (một cho mỗi ngày trong khoảng thời gian chiết khấu). Các ràng buộc thực thi sẽ đơn giản hơn nhưng bạn sẽ có rất nhiều hàng thay vì mỗi bảng hiện tại của bạn.

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