Стандартный триггер SQL Server является «после» вызывать. Это полезно для обновления журналов и других типов «после использования факта». Но вы хотите изменить входящий поток, прежде чем он даже попадет в таблицу.
Для этого вам нужен триггер «до».
Какого SQL Server не имеет ...
Не волнуйтесь, хотя, SQL Server делает иметь "вместо" спускового крючка. Первоначально предназначенный только для представлений, он также удобно был доступен для таблиц, возможно, разработчикам MS не нужно беспокоиться о реализации триггеров «до».
Вот пример. В таблице расписания есть поле datetime (SchedDate) и связанное целое поле (SchedHour), которое содержит только час поля datetime. Поэтому всякий раз, когда SchedDate изменяется, время должно быть записано в SchedHour.
create trigger T_Schedule_bu ON Schedule
instead of update as begin
set NoCount On;
update s
set s.Field1 = i.Field1,
s.Field2 = i.Field2,
s.SchedDate = i.SchedDate,
s.SchedHour =
case when i.SchedDate <> s.SchedDate
then DatePart(hour, i.SchedDate)
else s.SchedHour
end
from Schedule s
join inserted i
on i.ID = s.ID
end;
Другие поля изменены безоговорочно; SchedHour изменяется, только если SchedDate также был изменен. Фактически, в этом конкретном примере, действительно не обязательно выполнять этот тест. Он просто показывает, как это будет сделано.
Если вы не знакомы с триггерами «вместо», просто знайте, что сам триггер должен в конечном счете выполнить DML в целевой таблице, иначе этого не произойдет. Таким образом, один способ визуализации таблицы «только для чтения» - создать «вместо» триггер, который ничего не делает.
Вы должны использовать ключевые столбцы вставлены так, что только разыскиваемые строки обновляются. Также вставляется может содержать более одной строки, с извлечением данных в переменные, с которыми вы не можете справиться правильно. –
@JamesZ, так какое решение? – SpringLearner
Возможно, что-то вроде «update d set B = iA из вставленного i присоединяется к d на i.xxx = d.xxx и i.yyy = d.yyy», где столбцы xxx и yyy - это ключи, которые идентифицируют правильные строки –