2014-11-02 57 views
0

對於課堂作業,我們有以下情形:功能基於檢查約束

「我們看到我們的一些工作人員的儲備活動場所不能在事件容納預計參加什麼比有500人蔘加。一個最大容量只有200的事件,我們需要添加一個約束來防止這種情況的發生,爲了測試你的約束,添加以下2個事件。

我們直接使用功能,利用該功能的輸出檢查約束。這在它是我最好的拍攝至今:

CREATE FUNCTION f_nfp_venues_max_capacity 
(
    @event_exp_attendance int, 
    @event_venue_id int 
)  
RETURNS bit 
AS 
BEGIN 
DECLARE @ResultBit BIT = 1 
IF @event_exp_attendance > (SELECT venue_max_capacity FROM nfp_venues WHERE @event_venue_id = venue_id) 
    SELECT @ResultBit = 0 
RETURN  @ResultBit 

END 


ALTER TABLE nfp_events 
    ADD 
    CONSTRAINT ck_event_venue_capacity CHECK 
     (([dbo].[f_nfp_venues_max_capacity] (event_exp_attendance)=(1))) 

我得到這個錯誤,當我嘗試執行約束:

Msg 313, Level 16, State 2, Line 1 
An insufficient number of arguments were supplied for the procedure or function dbo.f_nfp_venues_max_capacity. 

任何幫助將不勝感激。

+2

[和這個人一樣的課程?](http://stackoverflow.com/q/26693571/73226)。檢查約束方法非常脆弱。例如,如果場地表中的場地容量發生變化,它將不會發射。因此可能允許存在違反規則的數據。 – 2014-11-02 21:41:40

+0

@MartinSmith如果有違反變更的事件需要檢查_venue容量> =現有事件容量_的場地表,則不會拒絕降低場地容量。或者可以通過您使用的索引視圖來處理? – jpw 2014-11-02 21:46:59

+0

@jpw索引視圖會自動處理雙方。您可以在場館桌上創建另一個檢查約束,但仍然可能有其他方式可能會失敗。 – 2014-11-02 21:57:01

回答

1

當您在約束中調用函數時,缺少一個必需的參數。您還需要在約束中通過event_venue_id

[dbo].[f_nfp_venues_max_capacity] (event_exp_attendance, event_venue_id) 

正如錯誤消息所示。