在一个触发器中插入和删除

Posted

技术标签:

【中文标题】在一个触发器中插入和删除【英文标题】: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 Server?你检查过这个问题http://***.com/questions/741414/insert-update-trigger-how-to-determine-if-insert-or-update吗? 我使用 SSMS 2008。谢谢。该链接有帮助! 【参考方案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

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

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

【讨论】:

【参考方案3】:

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

在你的 IF 语句中使用它:

检查更新:

SELECT * FROM DELETED 

检查插入:

SELECT * FROM INSERTED

编辑:

这是用于 SQL Server 的

【讨论】:

以上是关于在一个触发器中插入和删除的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 触发器中复制插入、更新、删除的行

您能否在视图上编写触发器,该视图在更改其基表后利用插入和删除表中的数据?

插入更新和删除场景中触发器的完整示例

插入触发器后删除

在插入之前触发删除记录

是否有可能在同一个触发器运行中发生混合更新和插入?