#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 — почему загадочные имена таблиц и столбцов?