Триггер при обновлении для предотвращения обновления, когда isedit! = 1 - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица:

ID NAME isedit
1  jon   0
2  smit  1
3  eve   0

Мне нужно создать триггер, который предотвращает обновление строки, когда isedit НЕ 1.

Однако он должен позволить мне установите isedit в первую очередь, например

update base SET isedit = 0 WHERE id = @id 

Я пробовал следующее:

CREATE TRIGGER dbo.onupdate
ON base
AFTER UPDATE
AS
  BEGIN
  If (SELECT isedit FROM base) NOT LIKE '1'
  Begin
    Return
  END    
END

Но я думаю, это не имеет особого смысла.

Ответы [ 2 ]

1 голос
/ 26 мая 2020
  1. Использовать logi на основе набора c, принимая во внимание, что Inserted может иметь несколько (или ноль) записей.
  2. Используйте rollback, чтобы отменить обновление, когда оно недействительно итак.
  3. Чтобы вы могли устанавливать и очищать isedit, поскольку вы обновляете его как обновление одного столбца, вы можете использовать функцию update(column), чтобы проверить изменение этого столбца и разрешить его прохождение.
    create trigger dbo.onupdate
    on base
    after update
    as
    begin
      set nocount on;

      if not update(isedit) and exists (
        select 1
        from Inserted I
        where isedit != 1
      ) begin
        rollback;
      end;
    end
0 голосов
/ 26 мая 2020

Пожалуйста, попробуйте этот лог c. Когда вы пытаетесь обновить что-то в основном, операция вставки и удаления будет выполняться в SQL.

Итак, когда вы выполняете обновление, оно удаляет исходную строку и сохраняет ее под логической таблицей с именем «удалено» и вставляет новую строку из логической таблицы с именем «вставлено».

таким образом вы можете получить значение из таблицы «удалено» и определить значение столбца isEdit! = 1, тогда будет выдана ошибка транзакции отката.

Create TRIGGER [dbo].onupdate
ON [dbo].base
FOR UPDATE
AS
    IF EXISTS(SELECT NULL FROM deleted where isEdit <> 1)
    BEGIN
        RAISERROR('You can not update when isEdit value is 1', 16, 1)
        ROLLBACK TRAN
    END
...