2015-01-15 28 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 2015-01-15 18:22:09

回答

0

试试这个,而以“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 *'相同 – 2015-01-15 17:13:43

+0

我的意思是IF EXISTS(从插入的WHERE中选择1)comm_preference IN('E','B')'和'IF EXISTS(SELECT * FROM插入的WHERE comm_preference IN('E','B')'。很多人写1只是认为*会选择所有的行,但它是一样的,对我来说*在这种情况下更具可读性 – 2015-01-15 17:17:37

+0

当你选择*在IF EXISTS中,没有什么区别,SQL SERVER在IF EXISTS语句中没有获取任何数据。参见http://stackoverflow.com/questions/26798285/which-is-better-select-1-vs-select-检查是否存在记录 – 2015-01-15 17:27:20

0

尝试这样的事情,它将插入email_sent表中的新记录;

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 

问候,

里斯

相关问题