Принудительно обновлять столбец до определенного значения при изменении - PullRequest
0 голосов
/ 21 февраля 2012

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

(история: какое-то приложение выполняет обновление для столбца, и я не могу найти какое приложение. Поэтому я решил сделать триггер дляпринудительно вернуть значение).

Чтобы упростить задачу ..

UsrTbl:
usrid usr   pwd
1001  admin qwerty
2001  cto   demo
3001  ceo   demo
...

Если кто-то обновляет pwd, где usr - admin, я хочу обновить его до определенного значения.

Если я сделаю триггер, что-то вроде:

CREATE TRIGGER the_usr_trg ON usrtbl AFTER UPDATE AS
UPDATE usrtbl SET pwd='qwerty' WHERE usr = 'admin'
GO

Выше я это исправлю?Что происходит, когда триггер обновляет столбец?Сработает ли триггер the_usr_trg снова?это вызовет цикл на сервере базы данных?или он будет работать только один раз?Есть ли лучший подход, чтобы это исправить?(кроме поиска того, какое приложение обновляет этот столбец:)

Спасибо!

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

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

SET RECURSIVE_TRIGGERS ON

Ваш код должен работать нормально.

1 голос
/ 21 февраля 2012

Я считаю, что это будет зависеть от уровня рекурсии для триггеров, которые находятся на БД.Если для RECURSIVE_TRIGGERS установлено значение OFF, он будет запущен только один раз.В вашем случае подумайте, что было бы лучше, если бы вы создали триггер INSTEAD OF, избегая, таким образом, первого UPDATE на вашем столе.В вашем случае это будет примерно так:

CREATE TRIGGER the_usr_trg ON usrtbl 
INSTEAD OF UPDATE 
AS
BEGIN

    UPDATE A
    SET pwd= B.pwd
    FROM usrtbl A
    INNER JOIN INSERTED B
        ON A.usr = B.usr
    WHERE usr != 'admin'

END
0 голосов
/ 21 февраля 2012

Что ж, согласно комментарию @ cadrell0, вы можете просто протестировать его в среде разработчика и посмотреть, будет ли он повторяться.

Более серьезная проблема заключается в том, что вы просто закрываете трещины, сбрасывая значение, а не выясняя основную причину - посмотрите на такие вещи, как системное представление sys.trigger_events или реализацию таблицы аудита (что является более типичным способом использовать триггер), чтобы увидеть, когда и почему значение изменяется.

Игнорирование того факта, что хранить пароли в виде обычного текста очень плохо ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...