【发布时间】:2015-03-13 14:19:41
【问题描述】:
这是我的(正在进行的)触发器。
ALTER TRIGGER [dbo].[trgInsertUpdate]
ON [dbo].[joinreason]
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @jr_active AS char(1), @jrid AS int;
SELECT @jr_active = (SELECT jr_active FROM INSERTED)
SELECT @jrid = (SELECT jrid FROM INSERTED)
IF UPDATE(jr_active)
BEGIN
IF (jr_active = 'N')
BEGIN
UPDATE joinreason
SET jr_active = 'N' where jr_par_jrid = jrid;
END
END
END
jr_active 列是“Y”或“N”。 业务要求是:
当一条记录没有 jr_par_id 时,它被认为是父记录。
当一条记录有 jr_par_id 时,它被认为是一个子记录。
- 孩子的 jr_par_id == 父母的 jrid
当父级的 jr_active 列从“Y”更改为“N”时:
- jr_active 列中的所有子项都应更新为“N”
我无法理解如何引用旧值(更新后更改的值)和新值(要更新的值)。
谁能看出我哪里出错了?
使用 SQL Server 2008
【问题讨论】:
-
请记住,触发器是基于集合的!在
joinreason中更新多行时,您现在拥有的代码将无法正常运行。 -
在给定时间不会更新超过一行。
-
如果插入了多行,那么您的触发器将抛出错误。
-
从应用程序的角度来看,这可能是正确的,但不要让自己陷入这种心态。多行更新将会发生并且随着这个触发器的发生,您的数据将会被破坏。修复您的触发器,以便它可以从一开始就处理多行。我的一个朋友在一家因触发器无法处理多行而倒闭的公司担任顾问。
-
@NickCarfagno
ever有多长?但这是可能的,对吧?所以你不应该考虑到这一点吗?
标签: sql sql-server database sql-server-2008 triggers