Вопрос:
Предположим, что у меня есть таблицы T1 и T2
Columns of T1 —>Value Columns of T2 —>OldValue NewValue
Что мне нужно – это триггер, который будет вставлять запись в T2 при обновлении T1, мне также нужно знать старое значение и новое значение, я никогда не использовал триггеры раньше, так что может ли кто-нибудь помочь мне в этом, как сделать Я собираюсь создать этот триггер. Возможно, спасибо.
Лучший ответ:
Ну, вы начинаете писать триггер с CREATE TRIGGER:
CREATE TRIGGER NameOfTheTriggerPlease …
Таблица, которая должна инициировать дополнительное действие, равна T1, поэтому триггер должен быть определен ON в этой таблице:
CREATE TRIGGER T1OnUpdate /* that just an example, you can use a different name */ ON T1 …
Действие, на которое должен запускаться триггер, – UPDATE, а время AFTER – обновление, поэтому…
CREATE TRIGGER T1OnUpdate ON T1 AFTER UPDATE …
Теперь пришло время ввести тело триггера, т.е. инструкции, которые должны быть выполнены триггером. Вы вводите тело с ключевым словом AS, за которым следуют сами утверждения.
В вашем случае будет только одно утверждение INSERT, что очевидно. Что не так очевидно, так это то, как мы будем обращаться к старым и новым значениям. Теперь SQL Server предлагает вам две виртуальные таблицы INSERTED и DELETED, и вы можете легко предположить, что первая содержит все новые значения, а последние – старые.
Эти таблицы имеют ту же структуру, что и таблица, которой назначен триггер, т.е. T1. Они содержат только строки, на которые повлиял конкретный оператор UPDATE, который вызывал триггер, что означает, что их может быть несколько. А это, в свою очередь, означает, что вам нужно иметь в своей таблице T1 первичный ключ или уникальный столбец (или набор столбцов), который можно использовать в триггере для соответствия удаленным и вставленным строкам. (На самом деле вам может понадобиться таблица T2, чтобы иметь столбец, который ссылался бы на первичный ключ T1, поэтому вы могли бы позже установить, какая строка T1 имела значения, хранящиеся в T2.)
В целях этого ответа я собираюсь предположить, что в столбце первичного ключа с именем PK и в столбце внешнего ключа с тем же именем в T2. А инструкция INSERT может выглядеть так:
CREATE TRIGGER T1OnUpdate ON T1 AFTER UPDATE AS INSERT INTO T2 (PK, OldValue, NewValue) SELECT i.PK, i.Value, d.Value FROM INSERTED i INNER JOIN DELETED d ON i.PK = d.PK
Последнее, но не менее важное: помните: весь оператор CREATE TRIGGER должен быть единственным в пакете, т.е. не должно быть операторов, предшествующих ключевым словам CREATE TRIGGER (но вы можете размещать там комментарии) и аналогично, все после ключевого слова AS считается частью тела триггера (но вы можете поместить разделитель GO, чтобы указать конец инструкции, если вы используете script в SQL Server Management Studio, например).
Полезное чтение:
Ответ №1
Я не собираюсь строить для вас все это (весело, правда?), но я могу указать вам в правильном направлении
create trigger logUpdate on T1 After update as begin insert into T2… —here is just an example select * from deleted —the DELETED table contains the OLD values select * from inserted —the INSERTED table contains the NEW values end
помните, что DELETED и INSERTED – это внутренние таблицы, содержащие старые и новые значения. В триггере обновления они оба существуют. В триггере вставки DELETED будет пустым, поскольку ничего не будет удалено. Такая же логика в триггере удаления, INSERTED будет пустым
EDIT:
Отвечая на ваш вопрос: независимо от того, сколько полей вы обновляете, ваши таблицы DELETED и INSERTED имеют все столбцы всех затронутых строк. Конечно, если вы обновите только один столбец, все остальные будут иметь одинаковое значение на DELETED и INSERTED
Ответ №2create trigger T_UPD_T1 on T1 FOR update as insert into T2 select deleted.value, inserted.value from inserted, deleted