假设我有三个表格[ONE],[ONE_TWO]和[TWO]。 [ONE_TWO]是只有[ONE_ID和[TWO_ID]列的多对多连接表。有外键设置为将[ONE]链接到[ONE_TWO],[TWO]链接到[ONE_TWO]。 FK使用ON DELETE CASCADE选项,这样如果删除[ONE]或[TWO]记录,关联的[ONE_TWO]记录也会自动删除。如何模拟SQL Server 2005中的BEFORE DELETE触发器
我希望在[TWO]表上有一个触发器,这样当一个[TWO]记录被删除时,它会执行一个存储过程,它将一个[ONE_ID]作为参数,传递已经存在的[ONE_ID]挂[TWO_ID]之前删除发生:
DECLARE @Statement NVARCHAR(max)
SET @Statement = ''
SELECT @Statement = @Statement + N'EXEC [MyProc] ''' + CAST([one_two].[one_id] AS VARCHAR(36)) + '''; '
FROM deleted
JOIN [one_two] ON deleted.[two_id] = [one_two].[two_id]
EXEC (@Statement)
很显然,我需要一个BEFORE DELETE触发器,但在SQL Server中没有这样的事情我2005年不能使用,因为的INSTEAD OF触发器级联FK。
我得到的印象是,如果我使用FOR DELETE触发器,当我加入[删除]到[ONE_TWO]以查找[ONE_ID]值列表时,FK级联将已经删除相关的[ONE_TWO]记录所以我永远不会找到任何[ONE_ID]值。这是真的?如果是这样,我该如何实现我的目标?
我想我需要改变FK加入[TWO]到[ONE_TWO]不使用级联,并在手动删除[TWO]之前手动删除[ONE_TWO] ] 记录。但是,如果有一种更简单的方法,我宁愿不这样做。
这个工作,但我的情况和你所提供的测试之间的区别是,我的表有外键约束这一切都有所不同。 create table [one_two](one_id int,two_id int); 。 ALTER TABLE [DBO] [one_two] ADD CONSTRAINT [FK_one_two__one_oneid] 外键([one_id]) 参考文献[DBO] [酮]([one_id]) ON DELETE CASCADE。 ALTER TABLE [DBO] [one_two] ADD CONSTRAINT [FK_one_two__two_twoid] 外键([two_id]) 参考文献[DBO] [2]([two_id]) ON DELETE CASCADE。; 此更改会导致测试失败。 – 2011-01-19 23:18:53