2010-11-10 53 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