3

たとえば、A、B、Cの3つの列で構成される複合主キーを持つテーブルがあります。UPDATEこれらの3つの列が変更されないことを確認するトリガーを作成します。これは私がこれまでに持っているものですが、うまくいかないようです:

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に更新されないことを期待していましたが、そうではありません。私はどこかで、これらの値が変更されたかどうかを調べinsertedて確認する必要があることを読みました。deletedだから私の質問はこれです、カーソルを使わずにこれをチェックできますか?

ありがとうございました。

4

1 に答える 1

4

あなたができる

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

または、これらの列の更新権限を拒否します。

どちらのアプローチも、値が実際に変更されたかどうかに関係なく、PK列を更新する試みを拒否します。SQL Serverには行レベルのトリガーがなくIDENTITY、テーブルに列がない限り(不変であることが保証されています)、PKが実際に更新されたかどうかをトリガーで判断する信頼できる方法はありません。

たとえば、以下のテーブルのトリガーのテーブルINSERTEDDELETEDテーブルは、両方のステートメントで同一になります。UPDATEUPDATE

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
于 2013-03-23T11:30:49.550 に答える