Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер update поля на update поля в той же таблице / 6 сообщений из 6, страница 1 из 1
12.05.2021, 10:48
    #40069553
lsk
lsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер update поля на update поля в той же таблице
Подскажите, пожалуйста, есть такая задача: при смене поля 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
12.05.2021, 11:30
    #40069564
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер update поля на update поля в той же таблице
lsk
Не будет ли зацикливания вызова триггера из-за того, что апдейтится одна и та же таблица?
зависит от значения параметра nested triggers
выполни и посмотри
Код: sql
1.
exec sp_configure



пс
нуу и у тебя же есть проверка IF UPDATE(Status)
так, что даже если nested triggers = 1, то на втором вызове триггера, рекурсия "закончится"
...
Рейтинг: 0 / 0
12.05.2021, 11:36
    #40069567
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер update поля на update поля в той же таблице
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
12.05.2021, 11:40
    #40069569
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер update поля на update поля в той же таблице
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
12.05.2021, 11:56
    #40069572
lsk
lsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер update поля на update поля в той же таблице
Спасибо всем большое за ответы, теперь окончательно разобрался.
...
Рейтинг: 0 / 0
12.05.2021, 12:36
    #40069585
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер update поля на update поля в той же таблице
Код: 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер update поля на update поля в той же таблице / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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