Триггерное переключение SQL Server Вставка, удаление, обновление - PullRequest
7 голосов
/ 17 ноября 2009

Привет, можно переключаться между командами / операциями 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 ]

19 голосов
/ 18 ноября 2009

Я покажу вам простой способ проверить это в SQL Server 2000 или 2005 (вы забыли упомянуть, какую версию вы используете), но в целом я согласен с Remus, что вы должны разбить их на отдельные триггеры:

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

Обратите внимание, что это может быть несовместимо с прямой совместимостью из-за сложности MERGE, представленной в SQL Server 2008. См. Этот элемент Connect для получения дополнительной информации:

Так что, если вы планируете использовать SQL Server 2008 и MERGE в будущем, это еще больше повод разделить триггер на триггер для каждого типа операции DML.

(И если вам нужно больше причин, чтобы избежать MERGE, , прочитайте это .)

7 голосов
/ 18 ноября 2009

Вы можете использовать таблицы inserted и deleted , чтобы увидеть, какие изменения были внесены в таблицу.

Для ОБНОВЛЕНИЯ таблица deleted содержит старую версию строки, а inserted новую версию.

DELETE и INSERT используют свои собственные таблицы, как и следовало ожидать.

6 голосов
/ 18 ноября 2009

Вы можете иметь три отдельных триггера, один для INSERT, один для UPDATE, один для DELETE.Поскольку каждый триггер отличается, нет необходимости в логике переключения.

3 голосов
/ 18 ноября 2009

Я думаю, что общий способ сделать это - создать триггер для каждого действия, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...