【问题标题】:SQL Server After Update Trigger Not firing更新触发器后 SQL Server 未触发
【发布时间】:2015-01-20 12:46:35
【问题描述】:

请帮忙,我一直在尝试创建一个更新触发器,以便在使用特定值更新数据后将数据插入到特定表中。 “公认”。由于某种原因,触发器没有触发

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[TRGIU_CLEARING_SAMPLE_RESULT]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
DROP TRIGGER [dbo].[TRGIU_CLEARING_SAMPLE_RESULT]
GO

CREATE TRIGGER [dbo].[TRGIU_CLEARING_SAMPLE_RESULT] ON [dbo].[CLEARING_BATCH]               
AFTER INSERT                
AS                

IF UPDATE(QM_STATUS)                
BEGIN                
  Declare @QM_Status Varchar(12),                
          @QM_Status_Old Varchar(12),                
          @Submission_Pk Uniqueidentifier            
                
  SELECT @QM_Status = I.QM_STATUS,                
         @QM_Status_old = D.QM_STATUS,                
         @Submission_Pk = I.PK               
         --@Lab_used = LE.ID                            
    FROM CLEARING_BATCH CB                
    LEFT JOIN SAMPLE_RESULT SR ON CB.PK = SR.PPK                 
    JOIN INSERTED I ON SR.PK = I.PPK                 
    JOIN DELETED D ON I.PK = D.PK 

             
  IF(@QM_Status = 'Accepted' and (@QM_Status <> @QM_Status_old or @QM_Status_old is null))                
  
  
  begin

  INSERT INTO BATCH(PPK,BATCH_ID)

  SELECT CB.PK,CB.BATCH_ID
  FROM LABORATORY L
  JOIN CLEARING_BATCH CB ON L.PK = CB.PPK
  JOIN CLEARING_SAMPLE_RESULT CSR ON CB.PK = CSR.PPK
  LEFT JOIN BATCH B ON CB.PK = B.PPK
  WHERE B.PPK IS NULL
 

  UPDATE BATCH
  SET BATCH_ID = CB.BATCH_ID

  FROM BATCH B
  JOIN CLEARING_BATCH CB ON B.PPK = CB.PPK

  END
  end
  GO

【问题讨论】:

  • 在任意审计表中添加一个插入来查看正在触发的内容,即在您的 IF 之前,以查看 IF 没有停止正在运行的代码。甚至可能添加多个插入以查看它被“抛出”的位置。
  • @BethuelMhiongo,在您的情况下,触发器不应该是 AFTER UPDATE 吗?
  • 你已经定义了一个 AFTER INSERT 触发器 - 这将在任何 INSERT 之后触发 - 而不是 UPDATE !你需要一个AFTER UPDATE 触发器...
  • 此外,您的代码似乎假设所有操作都只会影响一行。如果操作影响三行,您期望@QM_Status 的值是多少? “第一”行,“最后”行,“中间”行,随机,...?
  • @AnthonyHorne 在我将插入添加到任意审计表后,我能够看到当 QM_Status 更改为“已接受”时触发器正在触发,唯一的问题是它没有插入数据插入语句。但是,我设法通过修复我的联接和改进我的 where 条件来解决这个问题。 Eduard 和 marc_s 感谢您的提醒

标签: sql-server triggers


【解决方案1】:

你有一个AFTER INSERT触发器

CREATE TRIGGER [dbo].[TRGIU_CLEARING_SAMPLE_RESULT] 
ON [dbo].[CLEARING_BATCH]               
AFTER INSERT                
AS               

将在任何插入新行的INSERT 语句之后触发 - 当您UPDATE 某事时不会触发!

如果您想捕获UPDATE 操作,则需要一个AFTER UPDATE 触发器:

CREATE TRIGGER [dbo].[TRGIU_CLEARING_SAMPLE_RESULT] 
ON [dbo].[CLEARING_BATCH]
AFTER UPDATE
AS
   ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 2014-10-23
    • 2011-06-03
    • 1970-01-01
    • 2017-07-22
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多