【问题标题】:SQL Server Update TriggerSQL Server 更新触发器
【发布时间】:2011-06-03 09:07:18
【问题描述】:

我以前从未在 SQL Server 中使用过触发器,我在网上四处查看,但没有找到我的问题的答案。基本上我正在尝试编写一个触发器,该触发器将在表中的记录更新后运行。然后,此触发器将根据第一个表中更新的记录更新另外两个表。

带有触发器的主表将使用如下查询更新一条记录:

UPDATE E.SM_T_RList
SET IsActive = 0
WHERE Guid = @Guid

然后我希望触发器执行以下操作:

ALTER TRIGGER [E].[IsActiveUpdate] 
ON  [E].[SM_T_RList] 
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON;

UPDATE E.SM_T_BInfo
SET IsActive = 0
WHERE Guid = @Guid

UPDATE E.SM_T_RMachines
SET IsActive = 0
WHERE GUID = @GUID

END

主表正在使用我要更新的 Guid。但是我不知道如何将要更新到触发器中的@Guid 获取?请帮忙。

谢谢

【问题讨论】:

  • 你需要小心触发器 - 你确定这是你想要的吗?
  • 是的,基本上,当他们让员工处于非活动状态时,他们正在制作与该员工相关的额外数据。

标签: sql-server triggers


【解决方案1】:

已经发布的两个答案都遇到了同样的问题 - 他们将其他行标记为非活动,每当您的基表上发生任何更新

类似:

ALTER TRIGGER [E].[IsActiveUpdate] 
ON  [E].[SM_T_RList] 
AFTER UPDATE
AS
BEGIN

SET NOCOUNT ON;

UPDATE E.SM_T_BInfo
SET IsActive = 0
WHERE Guid IN (SELECT Guid FROM INSERTED where IsActive=0)

UPDATE E.SM_T_RMachines
SET IsActive = 0
WHERE Guid IN (SELECT Guid FROM INSERTED where IsActive=0)

END

会更合适

【讨论】:

    【解决方案2】:

    SQL Server 中的触发器对行集而不是单个行进行操作。您可以通过inserteddeleted 伪表访问这些。假设您可能希望 isactive 的值在之前不活动的行被激活时级联,您可以使用类似的东西。

    ALTER TRIGGER [E].[IsActiveUpdate] 
    ON  [E].[SM_T_RList] 
    AFTER UPDATE
    AS
    BEGIN
    
    SET NOCOUNT ON;
    
    UPDATE E.SM_T_BInfo
    SET IsActive = i.IsActive
    FROM INSERTED i JOIN E.SM_T_BInfo e
    ON e.Guid = i.Guid
    
    UPDATE E.SM_T_RMachines
    SET IsActive = i.IsActive
    FROM INSERTED i JOIN E.SM_T_BInfo e
    ON e.Guid = i.Guid
    
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2016-11-03
      • 2014-10-23
      • 2016-03-28
      • 2012-03-13
      相关资源
      最近更新 更多