SQL Server 2005 запускает - PullRequest
       5

SQL Server 2005 запускает

0 голосов
/ 11 марта 2010

Я создал триггер на столе для обновлений. Если произойдет какое-либо обновление, я хочу сохранить старое значение в отдельной таблице. Я пытаюсь получить старое значение из "вставленной" таблицы, но эта таблица не заполняется старыми значениями после обновления.

Вот пример кода:

CREATE TRIGGER [dbo].[Logs_Update]
   ON  [dbo].[Logs] AFTER  UPDATE
AS 

 DECLARE @url varchar(50)

BEGIN

 SELECT @url =  i.url 
   FROM INSERTED i

 INSERT INTO dbo.Triggers_tbl
   (ID, URL) 
 VALUES
   (1000, @url)

END

Я получаю @url как ноль из вставленной таблицы.

Пожалуйста, дайте мне знать, что не так с триггером

Ответы [ 3 ]

2 голосов
/ 11 марта 2010

Таблица DELETED содержит «старые» значения, а таблица «INSERTED» содержит «новые» значения.

Чтобы добавить к этому, таблицы INSERTED и DELETED могут содержать несколько строк, если ваше обновление затрагивает несколько строк, и поэтому вам, вероятно, следует выполнять вставку с помощью INSERT SELECT, а не переменной.

INSERT INTO dbo.Triggers_tbl(URL) SELECT d.url FROM DELETED d
1 голос
/ 11 марта 2010

«Старые» значения (после UPDATE) доступны в псевдотаблице Deleted:

CREATE TRIGGER [dbo].[Logs_Update]
   ON  [dbo].[Logs]
   AFTER  UPDATE
AS 
   DECLARE @url varchar(50)

   SELECT @url =  d.url from deleted d

   INSERT INTO dbo.Triggers_tbl(ID,URL) VALUES(1000,@url)

Как правильно прокомментировал HLGEM, код OP предполагает, что триггер будет вызываться для каждой строки в отдельности, что не является правильным.

В этом свете код триггера действительно должен иметь дело с набором строк , которые обновляются, и поэтому он должен быть примерно таким:

CREATE TRIGGER [dbo].[Logs_Update]
   ON  [dbo].[Logs]
   AFTER  UPDATE
AS 
   INSERT INTO dbo.Triggers_tbl(ID,URL) 
      SELECT 1000, d.url
      FROM Deleted d

или что-то в этом роде.

0 голосов
/ 11 марта 2010

Обновленные записи находятся в виртуальной таблице DELETED, а не INSERTED. Измените «с вставленного» на «с удаленного», и это должно работать.

...