Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Работа триггера  [new]
patrick1968
Member

Откуда:
Сообщений: 451
Добрый день. Проверяя работу триггера, наткнулся на непонятную для меня вещь, таблица inserted во время работы - пустая, почему такое может быть, отсюда и триггер не работает, вот текст

ALTER trigger [dbo].[trStatusUpd_ZEMPZ] on [dbo].[zempz] 
after update
as begin
--  bitmask is: power(2,(1-1))+power(2,(2-1))+power(2,(3-1)) 
	declare @resid bigint
	select @resid = resid from inserted



	declare @pos int
	select @pos = column_id from  sys.columns where object_id=(select object_id from  sys.tables where UPPER(name)='ZEMPZ') and name = 'status';

  if (COLUMNS_UPDATED() & POWER(2,@pos-1) > 0) 
	UPDATE dbo.res set statusa = dbo.CheckStatus(@resid) where resid = @resid;
end 


в пробел поставил select * from inserted и изменяя таблицу ZEMPZ получил пусто,

Сообщение было отредактировано: 7 ноя 17, 14:01
7 ноя 17, 13:46    [20932540]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36689
В таблице inserted может быть от 0 до бесконечности записей.
7 ноя 17, 14:01    [20932621]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
patrick1968,

1. Merge -ом меняете?
2. Ставят на входе проверку на наличие записей
3. Триггер на одну запись делать не комильфо
7 ноя 17, 14:02    [20932625]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
patrick1968,
UPDATE  [dbo].[zempz] SET zempz=zempz WHERE 2*2=5;
сколько строк даст в inserted/deleted триггера, а?

Кстати, значение zempz после такого UPDATE не изменилось,
а что скажет COLUMNS_UPDATED() & POWER(2,@pos-1) по этому поводу?

Приведите пример UPDATE, после которого вызывается показанный триггер.
7 ноя 17, 14:05    [20932637]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
patrick1968
Member

Откуда:
Сообщений: 451
Суть программного обеспечения такова, что одномоментно работа ведется с одной отдельно взятой записью и триггер как раз работает при изменении
7 ноя 17, 14:09    [20932659]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
patrick1968
Member

Откуда:
Сообщений: 451
вот запрос

update dbo.zempz
set status = 'НЕДЕЙСТВУЮЩЕЕ'
where resid = '5000001154'

в результат выдается

(строк обработано: 1) - это сам update

(строк обработано: 0) - вот это триггер
7 ноя 17, 14:13    [20932684]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
patrick1968,

так может ещё и istead of триггер есть?
7 ноя 17, 14:19    [20932726]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
patrick1968
Суть программного обеспечения такова, что одномоментно работа ведется с одной отдельно взятой записью и триггер как раз работает при изменении
Факт работы с одной записью должен быть, как минимум, проверен в начале триггера.
Если мы говорим о нормальном программировании, конечно.
Отсутствие записей в inserted или deleted триггера after update говорит либо о том, что таблица пуста,
либо о том, что ни одна запись не удовлетворяет условиям WHERE команды UPDATE
или условиям ON в INNER JOINах этой же команды.

Вместо COLUMNS_UPDATED() гораздо проще и логичнее применять такую же бесполезную функцию UPDATE().
Бесполезную, потому что она тоже не различает, было ли изменено значение поля или осталось прежним.
Всего лишь показывает, что в списке команды UPDATE было упомянуто это поле.
7 ноя 17, 14:20    [20932738]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
Зачем там переменная @resid?
Можно же в UPDATE приджойниться к inserted
7 ноя 17, 14:28    [20932780]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
patrick1968
Member

Откуда:
Сообщений: 451
просто проверять на входе сколько записей подлежит замене, можно конечно, но большого смысла в этом нет, т.к. если записей на замену нет, то ничего и не произойдет, согласно бизнес-логике, но в моем случае получается так, что запись на замену 1, а inserted пустая, вот что непонятно
7 ноя 17, 14:38    [20932837]     Ответить | Цитировать Сообщить модератору
 Re: Работа триггера  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36689
patrick1968
просто проверять на входе сколько записей подлежит замене, можно конечно, но большого смысла в этом нет
А если записей вдруг несколько, то триггер отрабатывает рандомно по одной из них. Ну, это, видимо, чтобы было веселее тем, у кого данная база будет на поддержке.
7 ноя 17, 14:44    [20932860]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить