Триггер SQL при обновлении - некоторые столбцы таблицы - PullRequest
0 голосов
/ 07 октября 2019

Мне нужно настроить триггер, который будет обновлять измененную дату, до текущей даты и времени, но только если имя пользователя или пароль будут изменены. Это 4-й и 5-й столбцы.

Я использовал подсказки из этой темы, чтобы попытаться сделать триггер. На данный момент я просто хотел заполнить таблицу журнала, чтобы проверить, правильно ли она работает. В конце концов, я бы включил вставку в журналы в оператор обновления для обновления даты изменения: Триггер обновления SQL только при изменении столбца

CREATE TRIGGER dbo.updUserData 
ON tblUserInfo
AFTER UPDATE 
AS  
    DECLARE @USR VARCHAR(8000)
    DECLARE @PW VARCHAR(8000)

    IF (COLUMNS_UPDATED() & 25) > 0
    BEGIN
        SELECT @USR = UI.UserName 
        FROM .[dbo].[tblUserInfo] UI
        INNER JOIN Inserted I ON UI.ID = I.ID 
        WHERE UI.UserName <> I.UserName

        SELECT @PW = EC.Password 
        FROM [dbo].[tblUserInfo] UI
        INNER JOIN Inserted I ON UI.ID = I.ID 
        WHERE UI.Password <> I.Password

        INSERT INTO logs
        VALUES ('USERNAME ' + @USR + 'OR PASSWORD CHANGED ' + @Pw) 
    END

Когда я изменяю 4-й или 5-йстолбец, я получаю новую запись в таблице журналов, но строка NULL. Он не вставляет строку, но ограничивает создание записи NULL только при изменении одного из этих двух столбцов. Этого достаточно для того, чтобы я знал, что это захватывает правильное действие, но я хотел посмотреть, смогу ли я заставить это работать и вставить фактическую строку в таблицу журналов, поскольку я думал, что это было бы хорошим упражнением для меня, чтобы получить право.

Если кто-нибудь может помочь мне пройти через финишную черту, я буду рад помощи.

Спасибо.

1 Ответ

1 голос
/ 07 октября 2019

Почему бы не использовать insert . . . select?

INSERT INTO logs (<name the column here>)
    SELECT 'USERNAME ' + i.username + 'OR PASSWORD CHANGED ' + i.password
    FROM inserted i JOIN
         deleted d
         ON i.id = d.id
    WHERE i.username <> d.username OR
          i.password <> d.password;
...