Триггер и замена даты в MSSql2000. Хочется ясности.
От: Сэма Россия  
Дата: 10.10.03 06:23
Оценка:
Есть некая таблица с некими данными. Задача заключается в том, что если пользователь добавляет или изменяет запись, то надо в поле 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. Хочется ясности.
От: _MarlboroMan_ Россия  
Дата: 10.10.03 07:42
Оценка:
Здравствуйте, Сэма, Вы писали:

С>Так вот, прошу внести просветление в мою темную голову:

С>1. Не будет ли каких сбоев... или все ли верно... или как надо правильно?
С>2. Если для INSERT у меня пратически сомнений нет, то насчет UPDATE уж как-то все странно. Будет ли работать? Если нет, то как надо?

я бы на твоем месте еще бы анализировал не изменена только колонка Work_Date. для этого смотри в сторону COLUMNS_UPDATED() и if UPDATE(column)
... << RSDN@Home 1.1 beta 2 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re: Триггер и замена даты в MSSql2000. Хочется ясности.
От: khast  
Дата: 10.10.03 07:58
Оценка:
Уважаемый Сэма!

Если у Вас разрешены рекурсивные триггеры для БД — Ваш триггер зациклится и
выдаст ошибку
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. Хочется ясности.
От: Сэма Россия  
Дата: 10.10.03 09:25
Оценка:
Здравствуйте, khast, Вы писали:
K>Возможно, имеет смысл изменить условие на IF NOT UPDATE (Work_Date) — ведь если поле служебное, пользователь его всяко не изменит

Еще как изменится. Наследие тяжелого аксесовского детства. Источник БД переделали, а вот логику еще нет. Поэтому в это поле время пытаются вставить с клиентского места, что не есть гуд. Вот и пришлось извращаться по этому поводу и заменять...

Так все-таки... Тригер будет работать на UPDATE или нет?
Re[3]: Триггер и замена даты в MSSql2000. Хочется ясности.
От: Shadowspan Россия  
Дата: 10.10.03 10:15
Оценка:
Здравствуйте, Сэма, Вы писали:

Переделать на INSTEAD OF триггер :
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  
Дата: 10.10.03 10:27
Оценка:
Здравствуйте, Сэма, Вы писали:

С>Здравствуйте, khast, Вы писали:

K>>Возможно, имеет смысл изменить условие на IF NOT UPDATE (Work_Date) — ведь если поле служебное, пользователь его всяко не изменит

Введите новое поле — если Access у вас работает по ODBC а не через OLEDB (.mdb База а не .adp Проект), то поле это никто не увидит. Если Access Project, то там ваще надо запретить работать на уровне таблиц, а не форм — иначе никто не гарантирует сохранность данных от действий пользователя.


С>Еще как изменится. Наследие тяжелого аксесовского детства. Источник БД переделали, а вот логику еще нет. Поэтому в это поле время пытаются вставить с клиентского места, что не есть гуд. Вот и пришлось извращаться по этому поводу и заменять...


С>Так все-таки... Тригер будет работать на UPDATE или нет?


Я же вроде ответил — нет, зациклится и выдаст ошибку если разрешены рекурентные триггеры, иначе — да, сработает.
Только логика уж очень странная — он изменяет поле, если изменнео именно это поле. А если другие поля изменились — он не зарегистрирует это изменение... Я ответил?

С уважением, khast
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.