在一个触发器中插入和删除
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
请记住,在触发器内部,您可以使用两个表 Deleted
和 Inserted
,它们与您的表具有相同的结构,并且它们具有插入或删除的行。
欲了解更多信息,请参阅此链接:Use the inserted and deleted Tables
【讨论】:
【参考方案3】:您可以使用“表”来检查数据是插入还是删除(更新被视为删除)。
在你的 IF 语句中使用它:
检查更新:
SELECT * FROM DELETED
检查插入:
SELECT * FROM INSERTED
编辑:
这是用于 SQL Server 的
【讨论】:
以上是关于在一个触发器中插入和删除的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 触发器中复制插入、更新、删除的行