powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер update поля на update поля в той же таблице
6 сообщений из 6, страница 1 из 1
триггер update поля на update поля в той же таблице
    #40069553
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Подскажите, пожалуйста, есть такая задача: при смене поля Status в таблице, надо сбросить поле флаг IsNewMessage в этой же таблице. Получился такой триггер:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TRIGGER Unit_Update
ON Unit
FOR UPDATE
AS

IF UPDATE(Status)
BEGIN
	SET NOCOUNT ON;
	UPDATE u
	SET IsNewMessage = 0
	FROM Unit u
	JOIN deleted d ON d.Id = u.Id	
END



Достаточно ли такого join-а с deleted или надо что-то типа

Код: sql
1.
2.
3.
4.
FROM Unit u
JOIN deleted d ON d.Id = u.Id
JOIN inserted i ON i.Id = u.Id
WHERE d.Status <> i.Status



Будет ли такой триггер работать, если сразу будут апдейтиться несколько записей в таблице? Не будет ли зацикливания вызова триггера из-за того, что апдейтится одна и та же таблица?

Заранее спасибо за ответ.
...
Рейтинг: 0 / 0
триггер update поля на update поля в той же таблице
    #40069564
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk
Не будет ли зацикливания вызова триггера из-за того, что апдейтится одна и та же таблица?
зависит от значения параметра nested triggers
выполни и посмотри
Код: sql
1.
exec sp_configure



пс
нуу и у тебя же есть проверка IF UPDATE(Status)
так, что даже если nested triggers = 1, то на втором вызове триггера, рекурсия "закончится"
...
Рейтинг: 0 / 0
триггер update поля на update поля в той же таблице
    #40069567
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk
Достаточно ли такого join-а с deleted или надо что-то типа

Код: sql
1.
2.
3.
4.
FROM Unit u
JOIN deleted d ON d.Id = u.Id
JOIN inserted i ON i.Id = u.Id
WHERE d.Status <> i.Status

да, так будет правильнее, так как UPDATE(Status) сработает и при
Код: sql
1.
set Status = Status


т.е. даже если фактического изменения нет
... нуу и, надеюсь, что Status у тебя NOT NULL
...
Рейтинг: 0 / 0
триггер update поля на update поля в той же таблице
    #40069569
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk,

Код: sql
1.
2.
3.
4.
5.
6.
update u set IsNewMessage = case
  when d.Status = u.Status or (d.Status is null and u.Status is null) then u.IsNewMessage
  else 0
end
FROM dbo.Unit u
  JOIN deleted d ON d.Id = u.Id;

Этого должно быть достаточно, т.к. такой триггер вызывается после изменения данных; соотв-но, данные в inserted будут совпадать с таблицей.

Условие обновления лучше перенести из WHERE в CASE, если Status может быть NULL. Если же у вас это поле NOT NULL, то можно выкинуть case и сделать where как у вас.
...
Рейтинг: 0 / 0
триггер update поля на update поля в той же таблице
    #40069572
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Спасибо всем большое за ответы, теперь окончательно разобрался.
...
Рейтинг: 0 / 0
триггер update поля на update поля в той же таблице
    #40069585
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TRIGGER Unit_Update ON Unit FOR UPDATE AS

	SET NOCOUNT ON;
	UPDATE u
	SET IsNewMessage = 0
	FROM Unit u
	JOIN deleted d ON d.Id = u.Id
	AND NOT EXISTS(SELECT u.Status INTERSECT SELECT d.Status);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер update поля на update поля в той же таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]