MSQL触发器根据特定字段的更新在第二个表中插入记录

MSQL触发器根据特定字段的更新在第二个表中插入记录,sql,sql-server,Sql,Sql Server,我需要在Microsoft SQL Server中编写一个简单的触发器。由于非标准语法,它涉及两个表: customer { customerno (integer) comm_preference (varchar(1)) email (varchar(255)) } email_sent { customerno (integer) email (varchar(255)) date (datetime) } customer.comm_首选项的有效值为M、E

我需要在Microsoft SQL Server中编写一个简单的触发器。由于非标准语法,它涉及两个表:

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

email_sent {
  customerno (integer)
  email (varchar(255))
  date (datetime)
}
customer.comm_首选项的有效值为M、E、B mobile和email。我需要一个触发器,如果值更改为E或B,则在发送的电子邮件中插入customer.customerno、customer.email和今天日期的记录


到目前为止,我的努力完全失败了。有人能帮我吗?

试试这个,它会在电子邮件发送表中插入一条新记录,同时插入带有“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

试试这样的东西

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
问候,


里斯

是的,它应该能工作。注意:SELECT 1与SELECT*相同,我的意思是如果存在,则从“E”、“B”中插入的comm_首选项中选择1与如果存在,则从“E”、“B”中插入的comm_首选项中选择*完全相同。很多人写1只是认为*会选择所有行。但它是一样的。对于我来说,在这种情况下*更具可读性。当您选择*inside(如果存在)时,没有区别。SQL SERVER不会在IF EXISTS语句中获取任何数据。看看这个@Piyush,那不是真的。在exists中使用select*时,它不会返回每一列。它只是检查是否有符合条件的行。两种情况下的实际性能都是相同的。归根结底,这是一个编码偏好的问题。不要在意SELECT 1是否优于SELECT*这个小问题,这个答案中的逻辑是错误的。触发器在每个操作中触发一次,而不是每行触发一次,因此此触发器实际执行的操作是,如果任何更新的行的comm_preference=E或B,则不管是否已更改,然后将所有更新的行插入电子邮件表中-我认为这不是原始海报想要的。如果您想测试此项,请尝试更新customer SET email=email,并查看发生了什么情况。您使用的是什么版本的MS SQL?