如何为SQL Server编写此触发器?

时间:2010-11-10 02:20:24

标签: sql sql-server triggers

假设我有一个表my_table(id, x, y)。如果y已经non-null,我想编写一个触发器来阻止更新x col并将其设置为null值。由于SQL Server没有更新前触发器,如何才能完成此操作?显然我们可以使用instead of触发器来实现此目的,但是我们如何检查旧的和当前的值并决定是否应该引发错误或让更新正常执行?

示例:

让我们假设我们在DB中有这一行:

1, null, null

然后这应该失败(引发错误)

update my_table set y = 'blah' where id = 1;

但这应该成功:

update my_table set y = null where id = 1;

我知道这个例子不是很有意义,但它与我想要实现的相似。

2 个答案:

答案 0 :(得分:3)

这应该可行,但我不确定您需要处理的其他边缘条件:

create table my_table (id int identity, x varchar(20), y varchar(20))
go 
CREATE TRIGGER tgNotNullYonMyTable
ON my_table
FOR UPDATE
AS 
IF UPDATE(y)
   BEGIN
       IF exists (
                  select 1 
                    from deleted d 
                         join inserted i on i.id = d.id 
                   where (d.x is null or i.x is null)
                         and i.y is null
                 ) 
          BEGIN
              RAISERROR ('Leave Y alone if x is null.', 16, 1)
              rollback tran
          END
   END
go

insert my_table values (null,null)

go 

update my_table set y = 'blah' where id = 1;
go 
update my_table set y = null where id = 1;

答案 1 :(得分:-1)

CREATE TRIGGER yxnull
ON mytable
FOR UPDATE
AS 
IF UPDATE(y)
   BEGIN
       IF deleted.x is null and inserted.y is not null
          BEGIN
              RAISERROR ('Leave Y alone if x is null.', 16, 1)
              ROLLBACK TRANSACTION

          END
   END
go