【发布时间】:2011-06-08 01:08:56
【问题描述】:
假设我有三个表,[ONE]、[ONE_TWO] 和 [TWO]。 [ONE_TWO] 是一个多对多连接表,只有 [ONE_ID 和 [TWO_ID] 列。设置了外键以将 [ONE] 链接到 [ONE_TWO] 和 [TWO] 链接到 [ONE_TWO]。 FK 使用 ON DELETE CASCADE 选项,因此如果删除 [ONE] 或 [TWO] 记录,关联的 [ONE_TWO] 记录也将被自动删除。
我想在 [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 中没有这样的东西。由于级联 FK,我不能使用 INSTEAD OF 触发器。
我的印象是,如果我使用 FOR DELETE 触发器,当我将 [deleted] 连接到 [ONE_TWO] 以查找 [ONE_ID] 值列表时,FK 级联将已经删除关联的 [ONE_TWO] 记录,所以我永远找不到任何 [ONE_ID] 值。这是真的?如果是这样,我怎样才能实现我的目标?
我想我需要将 FK 加入 [TWO] 更改为 [ONE_TWO] 以不使用级联,并在手动删除 [TWO] 之前在触发器中手动删除 [ONE_TWO]记录。但如果有更简单的方法,我宁愿不经历所有这些。
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql triggers