2010-11-10 83 views
1

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

例子:

让我们假设我们有这个行中的DB:

1, null, null 

那么这应该失败(提高误差)

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

但是,这应该会成功:

update my_table set y = null where id = 1; 

我知道这个例子不是很有意义,但它与我试图实现的类似。

+0

忍者 - 仅仅是明确的,如果'x'是'null',你是什么想要发生在'y'?将其设置为任意的非空值? – LittleBobbyTables 2010-11-10 02:25:37

+0

@LittleBobbyTables:请参阅更新的问题。 – Behrang 2010-11-10 02:41:46

回答

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
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 
+0

这不起作用。 SQL Server抱怨无法找到多部分标识符deleted.x。 – Behrang 2010-11-10 03:34:34

+0

我downvoted这个原因它甚至不解析,删除是一个“虚拟表”见:http://technet.microsoft.com/en-us/library/ms191300.aspx – 2010-11-10 06:09:46