以下SQL适用于一行更新,但在多行更新时失败:
CREATE TRIGGER update_fix
ON mytable
FOR UPDATE AS
BEGIN
SET NOCOUNT ON;
IF (SELECT f_month FROM inserted) = 99
AND (SELECT x_date FROM mytable
WHERE data_id IN ((SELECT data_id FROM inserted)))<= DateAdd(yy, -2, GetDate())
BEGIN
RAISERROR('Cannot update old records',16,1)
ROLLBACK TRANSACTION
RETURN;
END
END
GO
任何人都可以帮我改变触发器以适应影响多行的更新吗?应该检查每一行是否单独更新 - 所以如果有10行的更新,其中一个不应该更新 - 只是那一个不会更新,其他行将成功更新..即使可能触发器(考虑到我无法重新定义查询本身这些来自大型系统,这种变化将超出范围)?我担心一个查询=一个事务......我。所有都可以回滚,或者全部提交,但是......也许有可能......?
答案 0 :(得分:0)
使用INSTEAD OF
触发器。
在触发器中执行UPDATE
,并为更新添加WHERE
条件,以便只更新新的行。
然后,您可以使用您喜欢的任何逻辑来获取未更新的行的行数,并使用RAISERROR
发送类似&#34的消息;由于年龄而未更新5行&#34;或者你想要的任何东西。
然后根本不需要回滚事务。
答案 1 :(得分:0)
当然失败了。对于可以返回多个结果的子查询,您有一个=
。
if
看起来应该是这样的:
if (exists (select 1 from inserted where f_month = 99) and
exists (select 1
from mytable
where data_id in (select data_id from inserted) and
x_date <= dateadd(year, -2, getdate())
)
)
我不是100%确定这是相同的逻辑,因为这两个条件可能在不同的记录上。目前尚不清楚您想要的具体条件是什么。
如果两个条件都需要在同一记录上,则:
if (exists (select 1
from mytable
where data_id in (select data_id from inserted where f_month = 99) and
x_date <= dateadd(year, -2, getdate())
)
)