2013-03-23 67 views
2

我有一個表由3列組成的複合主鍵,我們假設A,B,C。我想創建一個觸發器,在UPDATE將檢查這三列不會改變。這是我到目前爲止,但它似乎並沒有工作:創建一個不會讓更新主鍵列的觸發器

CREATE TRIGGER TableTrigger 
ON Table 
AFTER INSERT, UPDATE AS 
BEGIN 
    IF (EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)) 
    BEGIN 
    -- Update Operation 
    IF (SELECT COUNT(*) FROM inserted WHERE A IS NOT NULL OR B IS NOT NULL OR C IS NOT NULL) > 0 
    BEGIN 
     RAISERROR('Error, you cannot change Primary Key columns', 16, 1) 
     ROLLBACK 
     RETURN 
    END 
END 

我期待,如果我更新表中的一些值,在inserted爲列中的值,我不更新到爲NULL,但不是那樣的。我在某處讀到我需要在inserteddeleted中查看這兩個值是否發生了變化。所以我的問題是,我可以檢查這個沒有使用光標?

謝謝。

回答

3

你可以做

CREATE TRIGGER TableTrigger 
ON Table 
AFTER UPDATE AS 
BEGIN 
IF UPDATE(A) OR UPDATE(B) OR UPDATE(C) 
    BEGIN 
     RAISERROR('Error, you cannot change Primary Key columns', 16, 1) 
     ROLLBACK 
     RETURN 
    END 
END 

或拒絕對這些列的UPDATE權限。

這兩種方法都會拒絕任何更新PK列的嘗試,而不管這些值是否實際改變。 SQL Server沒有行級觸發器,除非表中有一列(保證不可變),否則在觸發器中沒有可靠的方法來告知PK是否實際更新。

例如,下表中的UPDATE觸發器中的INSERTEDDELETED表對於兩個UPDATE語句都是相同的。

CREATE TABLE T(C INT PRIMARY KEY); 

INSERT INTO T VALUES (1),(-1) 

/*Both values swapped*/ 
UPDATE T SET C = -C 

/*Both values left the same*/ 
UPDATE T SET C = C 
+0

非常感謝你! – Cosmin 2013-03-23 11:44:42

相關問題