假设我有一个表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;
我知道这个例子不是很有意义,但它与我想要实现的相似。
答案 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