2009-11-17 5 views
7

Здравствуйте, можно переключаться между DML команд/операций (Insert, Delete, Update) на теле триггера ?, я пытаюсь фрагмент кода некоторые T-SQL для меня понять лучше:SQL Server триггер переключения Insert, Delete, Update

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 

Спасибо,

ответ

18

Я покажу вам простой способ проверить это на 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 
     -- insert 
    IF @i > 0 AND @d > 0 
     -- update 
    IF @i = 0 AND @d > 0 
     -- delete 
END 

Обратите внимание, что это не может быть совершенно вперед совместимы вследствие сложности MERGE вводит в SQL Server 2008. См этот пункт Connect для получения дополнительной информации: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321930

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

+0

+1 для «больше причины разбить триггер вверх». Это действительно сэкономило много времени и просто «сработало» - зачем беспокоиться со всем дерьмом, чтобы выяснить, что нужно сделать, когда отдельные триггеры выполняют работу так же хорошо. Спасибо @ Аарон. –

6

Вы можете иметь три отдельных триггеров, один для ВСТАВИТЬ одну для UPDATE один для удаления. Поскольку каждый триггер отличается, нет необходимости в логике коммутатора.

3

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

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 
7

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

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

УДАЛЕНИЕ И ВСТАВЬТЕ использовать собственный стол, как и следовало ожидать.

Смежные вопросы