2017-01-28 6 views
1

トリガー用のコードを読んでいます。行の削除を許可しないSQL Serverトリガー

CREATE TRIGGER No_DeleteCustomers 
ON Customers 
INSTEAD OF DELETE 
AS 
    IF @@ROWCOUNT = 0 
     RETURN 

    RAISERROR('No deleting allowed', 11, 1) 

しかし、私は混乱しています...最後の文で変更された行数を表示するために使用されていない@@ROWCOUNTされています...これはどのようにテーブルから行を削除するから私を防ぐのですか?

+0

正しいですが、@@ ROWCOUNTは返される行数の確認に使用されます。トリガー内のIFステートメントは、結果にゼロレコードがあるかどうかをチェックしてから、RAISERRORステートメントを実行します。 RAISERRORステートメントはトランザクションを終了し、 'No deletedting allowed'というメッセージを返します。これは、行を削除できないようにします。 – MayowaO

+0

なぜこのトリガーが存在するのか不思議です。テーブルの削除権限を拒否した方が良い考えです。 – Xedni

+3

@Xedniほとんどのユーザーには間違いありませんが、saなどのユーザーは権限を拒否できません。そのようなトリガーは、システム管理者が間違って行を削除するのを防ぐのに役立ちます(もちろん、引き金を引いて削除しますが、これは間違いで起こる可能性は低いです...) –

答えて

0

のは、これがどのように動作するかを示すために、トリガーのコードを一度にラインを見てみましょう:

IF @@ROWCOUNT = 0     -- if the number of rows to be deleted is 0 then... 
    RETURN       -- return 
            -- if still running... 
RAISERROR('No deleting allowed', 11, 1) -- raise an error to the caller 

は、この情報がお役に立てば幸い!

関連する問題