SQL Trigger для отмены изменения обновления таблицы, только когда другой столбец имеет определенные значения - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь написать триггер для того, что раньше было довольно простой задачей, чтобы он срабатывал сразу после изменения.Это был код для работы.

UPDATE       GrdFelde
SET                GrdInhalt = 0
WHERE        (GrdNummer LIKE 'BEST[A-Z][A-Z]%2') AND (GrdInhalt <> 0)

Это то, что я имею до сих пор.

CREATE TRIGGER [dbo].[GrdFelde_UTrig_Custom] ON [dbo].[GrdFelde] FOR UPDATE AS
SET NOCOUNT ON

IF UPDATE(GrdInhalt)
    BEGIN
        UPDATE       GrdFelde
        SET                GrdInhalt = 0
        WHERE        (GrdNummer LIKE 'BEST[A-Z][A-Z]%2') AND (GrdInhalt <> 0)
    END

Я новичок в триггерах и не уверен, что это работает.Моя проблема в том, что в этой таблице хранятся все изменения пользовательского интерфейса, поэтому он обновляется довольно часто, и я не хочу вызывать проблем с производительностью.Возможно ли, что триггер срабатывает только при выполнении критерия WHERE?И если да, куда бы я положил это утверждение?

1 Ответ

0 голосов
/ 02 октября 2018

Триггер сработает всякий раз, когда в таблице выполняется оператор обновления.Это невозможно контролировать (кроме полного отключения триггера).
Однако вы можете записать его для повышения производительности.

  1. Функция UPDATE()вернет 1, даже если оператор update / insert завершится неудачно, поэтому вы, вероятно, не хотите использовать его в качестве индикатора.

  2. У вас нет ссылки на inserted илик deleted таблицам в вашем триггере, то есть это может повлиять на записи, не включенные в исходный оператор обновления, который его запускает.

Я бы, вероятно, написал этот триггер так:

CREATE TRIGGER [dbo].[GrdFelde_UTrig_Custom] ON [dbo].[GrdFelde] 
FOR UPDATE AS
SET NOCOUNT ON

    UPDATE t
    SET GrdInhalt = 0
    FROM GrdFelde t
    JOIN INSERTED i ON t.<PKColumn(s)> = i.<PKColumn(s)>
    JOIN DELETED d  ON t.<PKColumn(s)> = d.<PKColumn(s)>
    WHERE t.GrdNummer LIKE 'BEST[A-Z][A-Z]%2'
    AND t.GrdInhalt <> 0
    AND ISNULL(CAST(i.GrdInhalt AS INT), -1) <> ISNULL(CAST(d.GrdInhalt AS INT), -1)

GO

Обратите внимание :

  1. Присоединяя таблицы inserted и deleted, я гарантирую, что триггер изменяет только произведенные строкиоператором, который его запустил.

  2. Замените <PKColumn(s)> на столбцы, которые составляют первичный ключ таблицы.

  3. Я приведу int и задаю -1 для нулевых значений, чтобы обработать случай изменения с нулевого на значениеили от значения до нуля.Если ваш столбец уже int, то приведение является избыточным.Если -1 является допустимым значением, вы можете рассмотреть приведение к varchar(11) и заменить null пустой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...