SQL Server:触发器禁用旧记录更新 - 单行更新工作,多个失败

时间:2015-10-30 13:32:47

标签: sql sql-server triggers

以下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行的更新,其中一个不应该更新 - 只是那一个不会更新,其他行将成功更新..即使可能触发器(考虑到我无法重新定义查询本身这些来自大型系统,这种变化将超出范围)?我担心一个查询=一个事务......我。所有都可以回滚,或者全部提交,但是......也许有可能......?

2 个答案:

答案 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())
           )
    )