【问题标题】:SQL Server trigger only if a field is false prior to update仅当字段在更新之前为 false 时 SQL Server 才会触发
【发布时间】:2020-09-23 11:14:48
【问题描述】:

如果emailstudio 列被更新,我在下面编写了插入值的触发器。此列可以是 0 或 1。

如何编写触发器,使其仅在 emailstudio 列从 0 更改为 1 时触发,而不是在它已经为 1 时触发?

谢谢

ALTER TRIGGER [dbo].[RM_Est_Email_Trigger]
ON  [dbo].[K3_BriefHeader] 
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @estimate int, @Email_Date datetime, @status int, @emailstudio bit
    SET @estimate = (SELECT Estimate from inserted)
    set @Email_Date = GETDATE()
    SET @status = (SELECT Status from inserted)
    SET @emailstudio = (SELECT EmailStudio from inserted)

    IF UPDATE (EmailStudio)
    BEGIN
        INSERT INTO [dbo].[K3_EstimateEmailDate] ([Estimate], [Email_Date],[Status], [EmailStudio])
        VALUES (@estimate, @Email_Date, @status, @emailstudio)
    END
END

【问题讨论】:

  • 您的触发器刚刚损坏,因为您假设inserted 只有一行。我建议您删除此问题并查看有关编写问题的 SQL Server 文档。如果您仍然有问题,请提出一个新问题,并带有至少可能起作用的触发器。
  • 感谢礼貌回复!触发器确实有效。我在更改后记录 K3_Briefheader 表中的所有值。感谢您的帮助戈登
  • 。 .如果同时插入多行,它将不起作用。 inserted 有一行的假设是触发器中的致命错误。
  • 一次只插入一行。

标签: sql-server tsql database-trigger


【解决方案1】:
Insert INTO [dbo].[K3_EstimateEmailDate] (
    [Estimate]
   ,[Email_Date]
   ,[Status]
   ,[EmailStudio]
)
SELECT Estimate
      ,GETDATE()
      ,status
      ,1
FROM inserted
     LEFT JOIN deleted
         ON deleted.<primarykey> = inserted.<primarykey>
WHERE inserted.emailstudio = 1
      AND (deleted.emailstudio is null -- inserted
           OR deleted.emailstudio = 0) -- updated 

【讨论】:

  • 谢谢阿德里安。我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2016-11-03
  • 1970-01-01
  • 2011-09-11
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多