SQL Trigger - Как мне проверить работу? - PullRequest
4 голосов
/ 18 мая 2011

Мой триггер срабатывает на INSERT, UPDATE and DELETE. Мне нужно вставить из соответствующей в память таблицы (inserted, deleted) в зависимости от того, какая операция активировала триггер. Поскольку только inserted заполнено на INSERT или deleted на DELETE, я полагаю, я могу просто вставить, и если строк нет, и я в порядке.

Но UPDATE заполняет обе таблицы. Я хочу только значения от deleted до UPDATE. Я пытался протестировать обновление, используя функцию UPDATE(column), но это возвращает TRUE даже на INSERT. Итак, как я могу проверить на UPDATE?

ALTER TRIGGER CREATE_tableAudit
   ON dbo.table
   FOR INSERT, UPDATE, DELETE
AS 
BEGIN          
    IF(UPDATE([column1]))--returns true on INSERT :(
        BEGIN
            INSERT INTO [dbo].[tableAudit]
               ([column1]
               ,[CreateDate]
               ,[UpdateDate])
               SELECT * from deleted --update
        END
    ELSE
        BEGIN
        --only inserted is populated on INSERT, visa-versa with DELETE
        INSERT INTO [dbo].[tableAudit]
               ([column1]
               ,[CreateDate]
               ,[UpdateDate])
               select * from inserted --insert


        INSERT INTO [dbo].[tableAudit]
               ([column1]
               ,[CreateDate]
               ,[UpdateDate])
               select * from deleted --delete

        END

Ответы [ 3 ]

3 голосов
/ 18 мая 2011

Чтобы проверить UPDATE, найдите идентичные значения первичного ключа в таблицах Inserted и Deleted.

/* These rows have been updated */
SELECT i.PKColumn
    FROM inserted i
        INNER JOIN deleted d
            ON i.PKColumn = d.PKColumn
2 голосов
/ 18 мая 2011

Предполагая, что первичные ключи строк не изменились, вы можете найти обновленные строки, соединив таблицы Inserted и Deleted в полях первичного ключа.Если объединение этих двух таблиц приводит к появлению строк, то можно смело предположить, что эти строки были обновлены.

Если обновление действительно изменяет первичный ключ строки, то вам, вероятно, лучше рассматривать его как две операции, удаление и вставка.

0 голосов
/ 13 февраля 2019

Следующее было полезно в триггерах: * В запросах можно изменить, чтобы включить только те поля, которые вы хотите сравнить; может исключить автонумер, если он изменяется в исходной таблице.

Для проверки на вставку:

if exists (Select * from inserted) and not exists(Select * from deleted)
begin
   ...
end

Для проверки обновлений:

if exists(SELECT * from inserted) and exists (SELECT * from deleted) 
begin
   ...
end

Для проверки удаленных:

if exists(select * from deleted) and not exists(Select * from inserted)
begin
   ...
end
...