2015-01-15 2 views
0

Мне нужно написать простой триггер в Microsoft SQL Server. Она включает две таблицы (извините за нестандартного синтаксиса):Триггер MSQL для вставки записи во вторую таблицу на основе обновления определенного поля

customer { 
    customerno (integer) 
    comm_preference (varchar(1)) 
    email (varchar(255)) 
    } 

email_sent { 
    customerno (integer) 
    email (varchar(255)) 
    date (datetime) 
} 

Допустимые значения для customer.comm_preference являются M, E, B (мобильный, электронная почта, и другое). Мне нужен триггер, который, если значение изменено на E или B, запись в customer.customerno, customer.email и сегодняшняя дата вставляются в email_sent.

До сих пор мои усилия были полной стиркой. Кто-нибудь может мне помочь?

+0

, какую версию вы используете в MS SQL? – HaveNoDisplayName

ответ

0

попробовать это, он будет вставить новую запись в email_sent таблице, а запись вставка с «E» или «B» или значение изменено на «E» или «B»

CREATE TRIGGER dbo.trg 
    ON customer 
    AFTER INSERT,UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT 1 FROM inserted WHERE comm_preference IN ('E', 'B') 
     BEGIN 
      INSERT INTO email_sent 
      SELECT customerno, email, GETDATE() from inserted 
     END   

END 
+0

Да, это должно сработать. Небольшое примечание: 'SELECT 1' совпадает с' SELECT * ' –

+0

Я имею в виду' IF EXISTS (SELECT 1 FROM insert WHERE comm_preference IN ('E', 'B') 'просто совпадает с' IF EXISTS (SELECT * FROM вставлено WHERE comm_preference IN ('E', 'B') '. Многие люди пишут 1, просто думая, что * выберет все строки, но это то же самое. Для меня * в этом случае более читаемо –

+0

Когда вы выбираете * внутри IF EXISTS нет разницы. SQL SERVER не извлекает данные в инструкции IF EXISTS. См. этот http://stackoverflow.com/questions/26798285/which-is-better-select-1-vs-select- to-check-the-exist-of-record –

0

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

CREATE TRIGGER trgCustomer_Update ON dbo.customer FOR UPDATE 
AS 
    BEGIN 
     IF UPDATE(comm_preference) 
      BEGIN 
       INSERT dbo.email_sent 
         (customerno 
         ,email 
         ,date 
         ) 
         SELECT i.customerno 
           ,i.email 
           ,GETDATE() 
         FROM inserted i 
         INNER JOIN deleted d 
         ON  i.customerno = d.customerno 
         WHERE d.comm_preference NOT IN ('E', 'B') AND 
           i.comm_preference IN ('E', 'B') 
      END 
    END 
GO 

С уважением,

Rhys