4

支払いテーブルの更新または削除のたびにトリガーされるトリガーを使用している場合、発生したトリガーのタイプを特定するにはどうすればよいですか(詳しく説明すると、レコードの更新またはレコードの削除のためにトリガー関数が呼び出されます)。

別のテーブルに保存するためにその情報が必要だからです。

4

3 に答える 3

9

指示:データをテーブルに挿入すると、「挿入された」だけが新しく挿入された行を持ちます。テーブルからデータを削除すると、「deleted」のみが削除された行を持ちます。テーブルを更新すると、「挿入」は新しい行を保存し、「削除」は古い行を保存します。

このサンプルはあなたにヒントを与えることができると思います。(SQL Server 2012)
サンプル:
サンプルテーブル定義:


create table Customer (
          ID int identity(1,1) not null, 
          FirstName varchar(30), 
          LastName varchar(30))
引き金:

CREATE TRIGGER TrackAction
ON Customer
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
   DECLARE @DELETEDCOUNT INT
   DECLARE @INSERTEDCOUNT INT
   SELECT @DELETEDCOUNT = COUNT() FROM deleted
   SELECT @INSERTEDCOUNT = COUNT() FROM inserted
   IF(@DELETEDCOUNT&@INSERTEDCOUNT > 0 )
       PRINT 'Trigger by update action'
   ELSE IF (@DELETEDCOUNT > 0 )
       PRINT 'Trigger by delete action'
   ELSE IF (@INSERTEDCOUNT > 0 )
       PRINT 'Trigger by insert action'
END
テストコード:

insert into Customer 
values ('Bob','Ryan')
update customer 
set FirstName = 'Bob Jr.'
where FirstName = 'Bob'
delete customer 
where FirstName = 'Bob Jr.'
テスト結果:
1。挿入アクションによる
トリガー2.更新アクションによる
トリガー3.削除アクションによるトリガー

于 2013-03-24T07:58:18.767 に答える
0

MS SQL Server?

あなたはそうしない。

SQLには、更新、挿入、削除を同時に行う単一のコマンドがあります(たとえば、MERGEを参照)。[deleted]、[inserted]、および[updated]の疑似テーブルがすべて入力された状態で、トリガーが1回呼び出されます。どちらかが起こったかどうかについて話すのは意味がありません。

于 2013-03-24T00:56:46.520 に答える
0

デバッグ中に使用するトリックの1つは、トリガー名を参照するトリガー内でPRINTを使用することです。とを含めるCOUNT(*) FROM INSERTEDCOUNT(*) FROM DELETED、メッセージ出力(少なくともSSMSでは)を監視して、起動されたトリガー、起動された順序、およびトリガーされたのが挿入、更新、または削除であったかどうかを確認できます。挿入にはCOUNT(*)=0DELETEDがあり、削除にはCOUNT(*)=0INSERTEDがあり、更新にはCOUNT(*)>0INSERTEDとDELETEDの両方があります。

于 2016-01-27T22:38:09.823 に答える