2016-10-21 4 views
-1

Как создать триггер для вставки и обновления, который будет автоматически передавать данные из одной (исходной) таблицы в другую (таблицы дестинации) (таблицы в разных базах данных)? Триггер должен передавать данные после каждого изменения в исходной таблице. Кто-нибудь знает как это сделать?Как создать триггер для данных вставки и обновления

+0

А что делать на удаление? И как вы будете хранить изменения? Если вам нужна точная копия, лучше использовать представление. Слишком широкая, пожалуйста, уточните. – gofr1

ответ

1

попробовать что-то вроде этого:

USE DB1; 
GO 

CREATE TRIGGER dbo.table1__AIU 
    ON dbo.table1 
    AFTER INSERT, UPDATE 
AS BEGIN 
    SET NOCOUNT ON; 

    DECLARE @operation char(1) = -- [I]nsert, [U]pdate, u[N]known 
     CASE 
      WHEN EXISTS(SELECT * FROM inserted) THEN 
       CASE WHEN EXISTS(SELECT * FROM deleted) THEN 'U' ELSE 'I' END 
      ELSE 'N' 
     END; 

    IF @operation = 'N' 
     RETURN; 

    IF @operation = 'I' 
     INSERT INTO DB2.dbo.Table2(id, b) 
      SELECT inserted.id, inserted.b 
      FROM inserted; 
    ELSE 
     UPDATE t2 
      SET b = inserted.b 
      FROM DB2.dbo.Table2 t2 
      INNER JOIN inserted i ON t2.id = inserted.id; 
END; 
GO 
+1

Виртуальные таблицы «вставлены» и «удалены» могут содержать несколько строк для пакетных вставок/обновлений/удалений. То, что вы написали, неверно, потому что вы предполагаете, что эти таблицы содержат только одну строку. Так что это будет некорректно для пакетных вставок/обновлений/удалений. Операторы вставки и обновления в конце триггера неверны. Вы не можете написать их таким образом. Оператор insert не может просто ссылаться на insert.XXX в предложении VALUES, оператор обновления не может ссылаться на вставленный .XXX без наличия вставленной таблицы в предложении FROM. –

+0

@TT, да, вы правы, это спешит (я изменил ответ, спасибо –

+0

Выглядит правильно. –

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