Есть некая таблица с некими данными. Задача заключается в том, что если пользователь добавляет или изменяет запись, то надо в поле Work_Date внести дату и время с сервера. Решил следующим образом:
USE SuperBase
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'DataPofig' AND type = 'TR')
DROP TRIGGER DataPofig
GO
CREATE TRIGGER DataPofig
ON tb_Subj
WITH ENCRYPTION
FOR INSERT, UPDATE
AS
IF UPDATE (Work_Date)
BEGIN
UPDATE tb_Subj
SET Work_Date=GETDATE ( )
WHERE ID IN (SELECT ID FROM inserted)
END
GO
Так вот, прошу внести просветление в мою темную голову:
1. Не будет ли каких сбоев... или все ли верно... или как надо правильно?
2. Если для INSERT у меня пратически сомнений нет, то насчет UPDATE уж как-то все странно. Будет ли работать? Если нет, то как надо?
Re: Триггер и замена даты в MSSql2000. Хочется ясности.
Здравствуйте, Сэма, Вы писали:
С>Так вот, прошу внести просветление в мою темную голову: С>1. Не будет ли каких сбоев... или все ли верно... или как надо правильно? С>2. Если для INSERT у меня пратически сомнений нет, то насчет UPDATE уж как-то все странно. Будет ли работать? Если нет, то как надо?
я бы на твоем месте еще бы анализировал не изменена только колонка Work_Date. для этого смотри в сторону COLUMNS_UPDATED() и if UPDATE(column)
... << RSDN@Home 1.1 beta 2 >>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re: Триггер и замена даты в MSSql2000. Хочется ясности.
Если у Вас разрешены рекурсивные триггеры для БД — Ваш триггер зациклится и
выдаст ошибку
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
Возможно, имеет смысл изменить условие на IF NOT UPDATE (Work_Date) — ведь если поле служебное, пользователь его всяко не изменит
С>
С>IF UPDATE (Work_Date)
С>BEGIN
С> UPDATE tb_Subj
С> SET Work_Date=GETDATE ( )
С> WHERE ID IN (SELECT ID FROM inserted)
С>
С уважением, khast
Re[2]: Триггер и замена даты в MSSql2000. Хочется ясности.
Здравствуйте, khast, Вы писали: K>Возможно, имеет смысл изменить условие на IF NOT UPDATE (Work_Date) — ведь если поле служебное, пользователь его всяко не изменит
Еще как изменится. Наследие тяжелого аксесовского детства. Источник БД переделали, а вот логику еще нет. Поэтому в это поле время пытаются вставить с клиентского места, что не есть гуд. Вот и пришлось извращаться по этому поводу и заменять...
Так все-таки... Тригер будет работать на UPDATE или нет?
Re[3]: Триггер и замена даты в MSSql2000. Хочется ясности.
CREATE TRIGGER DataPofig ON tb_Subj INSTEAD OF UPDATE
AS
UPDATE tb_Subj SET
f1 = i.f1,
f2 = i.f2,
.....,
WorkDate = GETDATE()
FROM tb_Subj t
INNER JOIN deleted d ON d.f1 = t.f1 AND d.f2 = t.f2 AND ....
INNER JOIN inserted i ON i.f1 = t.f1 AND i.f2 = t.f2 AND ....
можно проще, если есть ID
UPDATE tb_Subj SET
f1 = i.f1,
f2 = i.f2,
.....,
WorkDate = GETDATE()
FROM tb_Subj t
INNER JOIN deleted d ON d.ID = t.ID
INNER JOIN inserted i ON i.ID = t.ID
... << RSDN@Home 1.1 beta 2 >>
Re[3]: Триггер и замена даты в MSSql2000. Хочется ясности.
Здравствуйте, Сэма, Вы писали:
С>Здравствуйте, khast, Вы писали: K>>Возможно, имеет смысл изменить условие на IF NOT UPDATE (Work_Date) — ведь если поле служебное, пользователь его всяко не изменит
Введите новое поле — если Access у вас работает по ODBC а не через OLEDB (.mdb База а не .adp Проект), то поле это никто не увидит. Если Access Project, то там ваще надо запретить работать на уровне таблиц, а не форм — иначе никто не гарантирует сохранность данных от действий пользователя.
С>Еще как изменится. Наследие тяжелого аксесовского детства. Источник БД переделали, а вот логику еще нет. Поэтому в это поле время пытаются вставить с клиентского места, что не есть гуд. Вот и пришлось извращаться по этому поводу и заменять...
С>Так все-таки... Тригер будет работать на UPDATE или нет?
Я же вроде ответил — нет, зациклится и выдаст ошибку если разрешены рекурентные триггеры, иначе — да, сработает.
Только логика уж очень странная — он изменяет поле, если изменнео именно это поле. А если другие поля изменились — он не зарегистрирует это изменение... Я ответил?