2016-03-31 1 views
-1

У нас есть приложение, которое будет работать следующим образом, которое не может быть изменено.SQL Triggers, чтобы найти разницу между удаленным значением и вставленным значением

  1. Внешнее приложение примет полное значение таблицы в наборе данных.
  2. Мы будем обновлять любой столбец таблицы из внешнего приложения.
  3. Приложение просто получит обновленные значения (обновленные значения всей таблицы) и удалит все старое значение в таблице.
  4. Затем он будет вставлять все обновленные данные в таблицу.

Мы больше не можем изменять функциональность переднего плана.

Мне нужно получить удаленное значение в таблице и поместить в постоянную таблицу темп из триггера Delete. При вставке обновленных данных Insert trigger должен записывать все обновленные значения в другую постоянную таблицу temp.

После этого из триггера Insert нам нужно сравнить обе таблицы и выполнить определенную функцию (например: Функция X()) только тогда, когда конкретный столбец «X» изменился в значении.

Пожалуйста, помогите мне с триггером delete и insert в SQL 2008 R2.

Примечание:

  • Таблица содержит 5 колонок
  • Колонка A, B, C, X, D
  • А является первичным ключом.
+0

Как вы планируете управлять содержимым таблиц «постоянный темп»? Что-то должно их очистить после окончательного этапа обработки? – HABO

+0

Должен ли функционал X быть вызван внутри триггера? В противном случае вы можете использовать встроенную функцию «Изменить отслеживание данных» (https://msdn.microsoft.com/en-us/library/bb933994%28v=sql.100%29.aspx), а затем вызвать функцию X по таймеру измененные данные? – adrianm

ответ

1

Это очень плохой дизайн, но пусть будет так. Обратите внимание на второй триггер - это INSTEAD OF INSERT. В части «ELSE» вам нужно будет перечислить все столбцы и использовать их значение INSERTED.xxx, кроме X, где вы будете использовать вывод своей функции.

Я ожидаю, что таблица «TEMP_DELETED_DATA» имеет те же столбцы, что и «TABLE_WITH_DATA». Вам не нужна вторая временная таблица.

CREATE TRIGGER D_NAME 
ON TABLE_WITH_DATA 
FOR DELETE 
AS 
BEGIN 

     INSERT INTO TEMP_DELETED_DATA 
     SELECT * FROM DELETED 

END; 

CREATE TRIGGER I_NAME 
ON TABLE_WITH_DATA 
INSTEAD OF INSERT 
AS 
BEGIN 

    IF EXISTS (SELECT X FROM TEMP_DELETED_DATA WHERE A = (SELECT A FROM INSERTED)) --leave new inserts alone... 
    BEGIN 

     IF (SELECT X FROM TEMP_DELETED_DATA WHERE A = (SELECT A FROM INSERTED)) = (SELECT X FROM INSERTED) 
     BEGIN 
      INSERT INTO TABLE_WITH_DATA SELECT * FROM INSERTED -- X DID NOT CHANGE, INSERT AS IS 
     END 
     ELSE BEGIN --X CHANGED 
      DECLARE @X [type] --DATATYPE ACCORDING THE COLUMN 
      --CALL YOUR FUNCTION ... 
      INSERT INTO TABLE_WITH_DATA --ETC.... INSEAD OF INSERTED.X, YOU INSERT THE @X VARIABLE 
     END; 

    END 
    ELSE BEGIN 

    INSERT INTO TABLE_WITH_DATA SELECT * FROM INSERTED --NEW INSERT 

    END; 

END; 

Я ожидаю, что только одна строка вставлена ​​за раз. Если нет, то его необходимо отрегулировать соответственно.

BTW: триггер INSTEAD OF, может быть изменен также для очистки соответствующей строки от «временной» таблицы, если она больше не нужна, после «повторного ввода».

+0

Это не похоже на то, что он будет обрабатывать 'INSERT', который вставляет более одной строки, если он вообще работает. – HABO

+0

он не будет обрабатывать вставку, которая вставляет больше, чем строку сигл, но она может быть изменена соответствующим образом. Принцип тот же. –

+0

@HABO, что вы видите не так, что вы пишете «если это вообще работает»? Возможно, я пропустил что-то ... –

Смежные вопросы