SQL AFTER INSERT, UPDATE Триггер с условием обновления определенного столбца - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы создать триггер, который вставляет новые наборы данных в таблицу FREE08 (см. Пример кода) либо после вставки в FREE03. Эта часть работает. Но я также хочу вставить новый набор данных в FREE08, только если обновлен определенный столбец (FK2) FREE03. Возможно, это работает с оператором IF UPDATE (FK2) в триггере. Что происходит, я получаю новый набор данных в FREE08 каждый раз, когда у меня есть какие-либо обновления в FREE03. Как я могу получить это?

Спасибо за вашу поддержку

   USE [DB]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TRIGGER [dbo].[Einsatzhistorie Wechsler] 
       ON  [dbo].[FREE03]
       AFTER INSERT,UPDATE
    AS
      SET NOCOUNT ON;

      IF UPDATE(FK2)

    BEGIN

                            INSERT INTO FREE08
    (
    FK1,FK2,TEXT3,DATE1,TEXT2,DATE4
    ) 
    Select FK2,FK1,ID,DATE1,TEXT1,DATE11 From inserted 
                end

1 Ответ

0 голосов
/ 11 января 2019

Я никогда не нашел реального использования для функции UPDATE, так как она сообщает , был ли столбец подчинен UPDATE (т. Е. Появился в предложении SET), а не данные фактически изменились. Кроме того, конечно, триггеры срабатывают один раз за оператор, а не один раз за строку, поэтому ваш триггер может иметь дело со смесью строк, у у некоторых из которых изменилось FK2, а у некоторых нет.

Обычно лучше использовать deleted и сравнивать предыдущие / текущие значения:

CREATE TRIGGER [dbo].[Einsatzhistorie Wechsler] 
   ON  [dbo].[FREE03]
   AFTER INSERT,UPDATE
AS
  SET NOCOUNT ON;

INSERT INTO FREE08
(
FK1,FK2,TEXT3,DATE1,TEXT2,DATE4
) 
Select i.FK2,i.FK1,i.ID,i.DATE1,i.TEXT1,i.DATE11
From inserted i
left join deleted d
on
   i.ID = d.ID and
   i.FK2 = d.FK2
where d.ID is null

Здесь я предположил, а) что ID представляет неизменный первичный ключ для таблицы, и б) что FK2 не может быть обнуляемым.

...