【问题标题】:Insert and delete in one trigger在一个触发器中插入和删除
【发布时间】:2015-07-24 02:07:11
【问题描述】:

如何将以下两个触发器组合成一个触发器,一个是“插入后”,另一个是“删除后”?

create trigger TechStaff_update_Studio
on TechStaff after insert
begin
    update Studio
    set employees = employees + 1
    where studioID = Studio.studioID
end

create trigger TechStaff_update_Studio2
on TechStaff after delete
as
begin
    update Studio
    set employees = employees - 1
    where studioID = Studio.studioID
end

【问题讨论】:

标签: sql sql-server tsql triggers


【解决方案1】:

我猜是这样的:

create trigger TechStaff_update_Studio
on TechStaff after insert, delete
as
begin
    update s set employees = employees
        + (select count(*) from inserted)
        - (select count(*) from deleted)
    from Studio s

end

请注意,您必须实际计算行数,而不是假设每次触发器执行都会插入/删除一行(例如,delete * from TechStaff 将触发触发器一次)。

请参阅 the inserted and deleted pseudo-tables 上的 MSDN。

您的 where 子句始终为真 (studioID = studioID),因此不需要。我假设您的意思是更新 Studio 表的每一行(只有一行吗?)。

编辑:既然你说有多个 Studio 行,你需要更聪明。您必须通过 StudioID 获取已删除和插入的行数。以下内容可能会被简化,但我没有时间缩短它。

create trigger TechStaff_update_Studio
on TechStaff after insert, delete
as
begin
    update s set employees = employees + c.Delta
    from Studio s
    join (
        select StudioID, sum(i) as Delta
        from (
            select StudioID, 1 as i from inserted
            union all
            select StudioID, -1 as i from deleted 
        ) counts
        group by StudioID
    ) c on c.StudioID = s.StudioID
end

【讨论】:

  • 你可能是对的。不过,在 OP 确认之前,我不会为此编写代码。
  • 您的回答很有帮助。非常感谢你!就像 jpw 说的,Studio 表中有很多行。
  • @user1670163 在这种情况下,请检查我的编辑。在某些情况下,原始数据不会给出正确的计数。
【解决方案2】:

您可以像这样在一个触发器中处理它:

CREATE TRIGGER [dbo].[<TriggerName>]
ON [<SchemaName>].[<TabaleName>] FOR INSERT, DELETE
AS 
........-- Your Code

请记住,在触发器内部,您可以使用两个表 Deleted 和 Inserted,它们与您的表具有相同的结构,并且它们具有插入或删除的行。

欲了解更多信息,请参阅此链接:Use the inserted and deleted Tables

【讨论】:

    【解决方案3】:

    您可以使用“表”来检查数据是插入还是删除(更新被视为删除)。

    在你的 IF 语句中使用它:

    检查更新:

    SELECT * FROM DELETED 
    

    检查插入:

    SELECT * FROM INSERTED
    

    编辑:

    这是用于 SQL Server 的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多