Как написать этот триггер для SQL Server? - PullRequest
1 голос
/ 10 ноября 2010

Предположим, у меня есть таблица my_table(id, x, y).Я хочу написать триггер, чтобы предотвратить обновление столбца y и установить его в значение non-null, если x уже null.Поскольку в SQL Server нет триггера до обновления, как это можно сделать?По-видимому, мы можем использовать триггер instead of для этой цели, но как мы можем проверить старые и текущие значения и решить, следует ли нам выдавать ошибку или позволить обновлению выполняться нормально?

Пример:

Давайте представим, что у нас есть эта строка в БД:

1, null, null

Тогда это не удастся (ошибка повышения)

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

Но это должно произойти:

update my_table set y = null where id = 1;

Я знаю, что пример не очень значимый, но он похож на то, чего я пытаюсь достичь.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Это должно сработать, но я не уверен, какие другие граничные условия вам нужно обработать:

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;
0 голосов
/ 10 ноября 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...