Триггеры Sql Server используют два псевдо табличных вызова inserted
и deleted
, которые сохраняют записи, сделанные оператором, который запускает триггер.
В триггер для вставки, то deleted
таблица будет пустой, конечно, но inserted
таблица будет иметь все записи, которые были вставлены в таблицу (или должен быть вставлен в случае instead of
триггера.)
Важное примечание: На сервере Sql запускается огонь за оператор, а не за строку. Это означает, что даже если ваш оператор insert вставил 3 записи, триггер будет запущен только один раз, а ваша таблица inserted
будет содержать все 3 записи.
При написании триггеров, вы должны знать об этом факте, в противном случае вы можете получить исключения, или еще хуже, неправильные данные (худшие, так как вы не знаете, это в режиме реального времени)
Для дальнейшего чтения, пожалуйста, обратитесь к the relevant page in Microsoft's documentatin.
Так триггер должен выглядеть следующим образом:
CREATE TRIGGER originalTable_Audit ON [originalTable]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
INSERT INTO originalTable_Audit (<Columns List of originalTable_Audit>)
SELECT <Columns List of originalTable>
FROM insterted
END
Спасибо. оно работает. Я googled еще где и я думал, что вставленный является само объявленной таблицей. после пробуждения, тогда понял, что это от mssql –