【发布时间】:2012-04-17 07:21:27
【问题描述】:
我正在尝试创建一个基本的数据库触发器,当删除 database2.table2 中的一行时,该触发器有条件地从 database1.table1 中删除行。我是触发器的新手,并希望学习完成此任务的最佳方法。这是我到目前为止所拥有的。有什么建议吗?
CREATE TRIGGER sampleTrigger
ON database1.dbo.table1
FOR DELETE
AS
IF EXISTS (SELECT foo
FROM database2.dbo.table2
WHERE id = deleted.id
AND bar = 4)
-- If there is a row that exists in database2.dbo.table2
-- matching the id of the deleted row and bar=4, delete
-- it as well.
-- DELETE STATEMENT?
GO
【问题讨论】:
-
您需要考虑到触发器每个语句触发一次(并且许多开发人员认为NOT每行触发一次)并且
Deleted伪表可能包含多行(如果您的语句删除了多行) -
@marc_s - 在系统中,一次只能删除一行(应用程序前端)。您能否详细说明您的意思。是不是把
WHERE id = deleted.id改成WHERE id IN (SELECT id FROM deleted)这么简单? -
@ShawnH。是的,应该就是这么简单。我认为 Marc 的意思是,如果以某种方式从某处调用了批量删除,则触发器只会为整个语句而不是每行触发一次,因此使用
IN应该以任何一种方式对其进行排序。 -
@ShawnH:是的,基本上这种改变会起作用——只是不要期望/假设
Deleted表总是只有一行——它可能有多个。因此,如果Deleted伪表中有多行,那么您的原始语句....WHERE id = deleted.id在其他系统中将惨遭失败 -
@marc_s - 很高兴知道。未来的应用程序谢谢你们。
标签: sql-server sql-server-2005 triggers