2008-09-02 64 views

回答

7

您可以創建一個INSERT TRIGGER來檢查條件是否滿足。這樣所有更新都會直接進行。

CREATE TRIGGER employee_insupd 
ON employee 
FOR INSERT 
AS 
/* Get the range of level for this job type from the jobs table. */ 
DECLARE @min_lvl tinyint, 
    @max_lvl tinyint, 
    @emp_lvl tinyint, 
    @job_id smallint 
SELECT @min_lvl = min_lvl, 
    @max_lvl = max_lvl, 
    @emp_lvl = i.job_lvl, 
    @job_id = i.job_id 
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id 
    JOIN jobs j ON j.job_id = i.job_id 
IF (@job_id = 1) and (@emp_lvl <> 10) 
BEGIN 
    RAISERROR ('Job id 1 expects the default level of 10.', 16, 1) 
    ROLLBACK TRANSACTION 
END 
ELSE 
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) 
BEGIN 
    RAISERROR ('The level for job_id:%d should be between %d and %d.', 
     16, 1, @job_id, @min_lvl, @max_lvl) 
    ROLLBACK TRANSACTION 
END 
1

我認爲你最好的選擇是刪除顯式約束併爲插入添加一個cursor,這樣你就可以在那裏執行你的檢查並在違反約束時產生一個錯誤。

1

什麼樣的約束?我在猜測外鍵約束,因爲你暗示刪除一行可能會違反約束條件。如果是這樣的話,似乎你本身並不需要約束,因爲你不關心參照完整性。

不知道更多關於您的具體情況,我會迴應其他海報的意圖,這似乎是「強制執行數據訪問層中的插入要求」。但是,我會狡猾地實施它們。一個觸發器看起來像是矯枉過正,任何有能力的DBA都應該用木製的尺子嚴格地抨擊你的指關節,試圖用光標執行簡單的插入操作。存儲過程應該足夠了。