8

こんにちは、トリガー本体でDMLコマンド/操作(挿入、削除、更新)を切り替えることができますか?私は理解を深めるためにいくつかのT-SQLをスニペットしようとしています:

CREATE TRIGGER DML_ON_TABLEA
   ON  TABLEA
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    CASE 
    WHEN (INSERT) THEN
        -- INSERT ON AUX TABLEB 
    WHEN (DELETE) THEN
        -- DELETE ON AUX TABLEB 
    ELSE --OR WHEN (UPDATE) THEN
        -- UPDATE ON AUX TABLEB 
    END
END
GO

ありがとう、

4

5 に答える 5

21

SQL Server 2000 または 2005 でこれを確認する簡単な方法を紹介します (使用しているバージョンについて言及するのを忘れていました)。

DECLARE @i INT, @d INT;
SELECT @i = COUNT(*) FROM inserted;
SELECT @d = COUNT(*) FROM deleted;
IF @i + @d > 0
BEGIN
    IF @i > 0 AND @d = 0
    BEGIN
        -- logic for insert
    END

    IF @i > 0 AND @d > 0
    BEGIN
        -- logic for update
    END

    IF @i = 0 AND @d > 0
    BEGIN
        -- logic for delete
    END
END

これは、SQL Server 2008 で導入された複雑さのため、完全な前方互換性がない可能性があることに注意してMERGEください。詳細については、この Connect 項目を参照してください。

そのため、SQL Server 2008 を使用する予定がある場合、およびMERGE将来的には、トリガーを DML 操作の種類ごとにトリガーに分割する必要があります。

(さらに、避けるべき理由が必要な場合は、これとこれMERGE読んでください。)

于 2009-11-17T21:12:58.580 に答える
7

insertedおよびdeletedテーブルを使用して、テーブルに加えられた変更を確認できます。

UPDATE の場合、deletedテーブルには行の古いバージョンとinserted新しいバージョンが含まれます。

ご想像のとおり、DELETE と INSERT は独自のテーブルを使用します。

于 2009-11-17T21:16:06.717 に答える
6

INSERT 用に 1 つ、UPDATE 用に 1 つ、DELETE 用に 1 つずつ、合計 3 つのトリガーを使用できます。各トリガーが異なるため、切り替えロジックは必要ありません。

于 2009-11-17T21:05:48.540 に答える
2

これを行う一般的な方法は、次のように各アクションのトリガーを作成することだと思います。

CREATE TRIGGER INSERT_ON_TABLEA   
ON  TABLEA   
AFTER INSERT 
AS 
BEGIN    
SET NOCOUNT ON;    
-- INSERT ON AUX TABLEB
END
GO

CREATE TRIGGER DELETE_ON_TABLEA   
ON  TABLEA   
AFTER DELETE
AS 
BEGIN    
SET NOCOUNT ON;    
-- DELETE ON AUX TABLEB
END
GO
于 2009-11-17T21:15:36.093 に答える