2013-11-12 3 views
0

У меня есть таблица Products, которая содержит атрибут, который будет обновляться через ERP-обновление конечным пользователем. Когда это произойдет, мне нужно, чтобы обновление было реплицировано в другую таблицу. У меня совсем нет опыта создания триггеров T-SQL, но я считаю, что это выполнит мою задачу.Использование триггера tsql для синхронизации данных в двух таблицах

Пример: В IC_Products таблице:

Productkey = 456 
StockLocation = ‘GA-07-A250’ 

В IC_ProductCustomFields таблице (будет начать тот же потому, что будет запускать сценарий, чтобы сделать это так):

Productkey = 456 
CustomFieldKey = 13 
Value = ‘GA-07-A250’ 

Когда IC_Products.StockLocation колонка обновляется, после чего я хочу, чтобы значение в новом IC_ProductCustomFields.Value также автоматически обновлялось и сразу.
Если новая запись создана в IC_Products, тогда я хочу, чтобы новая запись также была создана в IC_ProductCustomFields.

Я хотел бы знать, как написать сценарий триггера, а также как его реализовать. Я использую SQL Server 2005.

ответ

0

Вы хотите что-то вроде этого:

CREATE TRIGGER [dbo].[tr_Products_SyncCustomFields] ON [dbo].[IC_Products] 
FOR INSERT, UPDATE 
AS 
    -- First, we'll handle the update. If the record doesn't exist, we'll handle that second 
    UPDATE IC_ProductCustomFields 
    SET Value = inserted.StockLocation 
    FROM IC_ProductCustomFields cf 
     INNER JOIN inserted -- Yes, we want inserted. In triggers you just get inserted and deleted 
      ON cf.Productkey = inserted.Productkey AND CustomFieldKey = 13; 

    -- Now handle the insert where required. Note the NOT EXISTS criteria 
    INSERT INTO IC_ProductCustomFields (Productkey, CustomFieldKey, Value) 
    SELECT Productkey, CustomFieldKey, Value 
    FROM inserted 
    WHERE NOT EXISTS 
    (
     SELECT * 
     FROM IC_ProductCustomFields 
     WHERE Productkey = inserted.Productkey AND CustomFieldKey = 13 
    ); 

GO 

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

+0

Спасибо Доминик. Хорошо, что это будет работать. Я попробую попробовать в тестовом экземпляре. Итак, когда я это исполню, он будет реализован в то время? Если да, то как бы удалить его, если потребуется? В прошлом я заметил, что иногда триггеры отключены; Я не был вовлечен в исправление, поэтому я не знал, что вызвало это, или что это было за решение; повторить выполнение кода? – user2984486

+0

Триггер вступает в силу сразу же после его создания. Я не знаю, как создать триггер в отключенном состоянии, но вы можете сделать это из T-SQL с помощью «ENABLE TRIGGER» и «DISABLE TRIGGER» или через SSMS (щелкните правой кнопкой мыши на триггере и выберите «Включить/отключить») , Конечно, я обязательно проверю ваш триггер в тестовом экземпляре, конечно, как вы упомянули, прежде чем применять его к живой системе. Мы используем триггеры с нашей ERP-системой для аналогичных целей, и обычно она работает нормально, но вы захотите проверить ее внимательно. –

+0

Почему мы не можем использовать 'IF (@RowCount = 0)/* DO INSERT HERE * /'? Похоже, что это будет более эффективно. – Kiryl

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