2016-11-17 2 views
0

У меня есть таблица аудита для отслеживания операций вставки/обновления. Моя проблема в том, что при обновлении есть 2 случая. 1) регулярное обновление 2) обновление до поля с именем Isdeleted от false до true.mssql trigger - выбор конкретных данных из таблицы INSERTED

Я попытался отделить оба случая, но я что-то упустил, я новичок в триггерах.

DECLARE @Action AS CHAR(1) 
DECLARE @Count AS INT 


SET @Action = 'I' 
SELECT @Count = COUNT(*) FROM DELETED 
if @Count > 0 
    BEGIN 
     SET @Action = 'D' 
     SELECT @Count = COUNT(*) FROM INSERTED WHERE INSERTED.IsDeleted = 0 
     IF @Count > 0 
      SET @Action = 'U' 
    END 

Что я хочу сделать, это получить к действию = «D», когда единственное значение, которое было изменено было IsDeleted (от ложного к истине). И «U», когда было изменено какое-либо другое значение.

ответ

1

В зависимости от того, как вы создали свой триггер, вы можете изменить его, чтобы использовать UPDATE(), чтобы упростить логику установки значения @Action.

Например:

CREATE TRIGGER myTrigger ON myTable AFTER UPDATE, DELETE 
BEGIN 

    DECLARE @Action AS CHAR(1) 

    IF UPDATE(isDeleted) 
     SET @Action = 'U' 

END 

Это будет срабатывать каждый раз, но только SET значение @Action, когда происходит изменение на isDeleted колонке, которую я считаю, что вы ищете.

Я не уверен, что вы собираетесь делать с этим дальше, но он будет делать то, что вам нужно.

0

Этот выбор будет возвращать количество строк, столбец IsDeleted был обновлен от 0 до 1:

select count(*) 
from inserted inner join deleted on <fk_column(s)> 
where deleted.IsDeleted = 0 
and inserted.IsDeleted = 1 

Однако, поскольку триггеры работает на заявление (а не для каждой строки), возможны случаи, когда некоторые строки удаляются, а некоторые просто обновляются, поэтому сохранение действия в строке может быть немного сложнее, чем это.

0

попробовать Это:


DECLARE @Action AS CHAR(1) 
DECLARE @Count AS INT 

IF NOT EXISTS(SELECT 1 FROM Deleted) 
BEGIN 
    SELECT 
     @Action = 'I' 
END 
ELSE 
BEGIN 

    SELECT 
    @Count = COUNT(1) 
    FROM Inserted Ins 
     INNER JOIN Deleted Del 
     ON Ins.SeqNo = Del.SeqNo 
     WHERE ISNULL(Ins.IsDeleted,0) <> ISNULL(Del.IsDeleted,0) 
      AND Ins.Column1 = Del.Column1 
      AND Ins.Column2 = Del.Column2 
      AND Ins.ColumnN = Del.ColumnN 

    SELECT 
    @Action = CASE WHEN ISNULL(@Count,0)>0 
       THEN 'D' 
       ELSE 'U' END 

END 

SELECT 
    [ActionCode] = @Action 
Смежные вопросы