Написать триггер для ВСТАВКИ, а также ОБНОВЛЕНИЯ в SQL

#sql #sql-server #triggers #sql-server-2017

#sql #sql-сервер #триггеры #sql-server-2017

Вопрос:

Я написал триггер, который должен срабатывать, когда происходит ВСТАВКА или ОБНОВЛЕНИЕ таблицы «COST_HDR», и DML должен обновить один из столбцов этой таблицы, т.е. «CMPL_STS» на «C». Мой триггер работает не так, как ожидалось. Если CMPL_STS напрямую обновляется до ‘C’ в качестве новой записи, триггер работает должным образом. Но если он обновляется до ‘D’ в качестве новой записи, а затем до ‘C’ в качестве обновления, триггеру не удается вставить какую-либо запись в таблицу TMP_XNS.

Кто-нибудь может проверить, что не так:

 CREATE TRIGGER MyTrigger
ON [COST_HDR]
AFTER INSERT, UPDATE
AS
BEGIN
  DECLARE @UpdtStamp    DATETIME    =  GETUTCDATE()
  --
  IF UPDATE (CMPL_STS)
  BEGIN
  INSERT INTO [TMP_XNS]
  (
    HDR_UID,
    UPDT_STAMP
  )
         SELECT I.HDR_UID,
                @updtStamp
           FROM INSERTED I
LEFT OUTER JOIN DELETED D
             ON D.HDR_UID = I.HDR_UID
            AND ISNULL(I.CMPL_STS,'N') <> ISNULL(D.CMPL_STS,'N')  
          WHERE I.CMPL_STS = 'C'
                
  END
  --    
END
GO
 

Комментарии:

1. MySQL и SQL Server? Этот код не будет выполняться на обоих — какой из них вы используете?

2. sql server @jarlh

3. ЕСЛИ UPDATE() не выполняет то, что вы могли подумать — найдите обсуждения в Интернете. Но что еще более важно, что именно означает «сбой запуска»? И НИКОГДА НЕ бывает веской причины объявлять переменную флага как VARCHAR(1) . Здесь нет ничего переменного, но оно также не используется. И я предлагаю вам написать 2 отдельных триггера на данный момент и заставить их оба работать правильно. Затем объедините их, если у вас ДЕЙСТВИТЕЛЬНО есть веская причина для этого.

4. @SMor — Обновил мой вопрос.. Пропущено удаление неиспользуемой переменной. И, пожалуйста, проверьте описание проблемы еще раз. Я обновил его сейчас.. «Сбой триггера» означает, что триггер не может вставить данные в таблицу TMP_XNS

5. И снова — разбейте ваш триггер на отдельные версии insert / update. Давайте сначала обратимся к insert. Что происходит при вставке? Зависит ли «действие» от значения CMPL_STS во вставленных строках? Обратите внимание, что ЕСЛИ UPDATE всегда возвращает TRUE для вставки. И FWIW — почему загадочные имена таблиц и столбцов?