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

Есть две базы:

база а, в которой есть таблица dbo.table
база b, в которой есть таблица my.table

В таблице dbo.table в базе a лежат мастер-данные.
В базе a есть триггер на insert, update, delete, который синхронизирует данные между таблицами в базе a и базе b.

Код триггера (довольно простой):
create trigger [dbo].[tr_iud_transfer] on [dbo].[table]
for insert, update, delete
as
set nocount on
	declare @action char(1)
select
   @action = case	when exists ( select
									1
								  from
								 inserted )
					 and exists ( select
									1
								  from
									deleted ) then 'U'
					when exists ( select
									1
									from
									 inserted ) then 'I'
					else 'D'
   				end             
	if @action = 'D'
		delete [B].[my].[table]
		where [Id] in (select [Id] from deleted)

	if @action = 'I'
		insert into [B].[my].[table] ([id],  [field])
		select [id],  [field] from inserted

	if @action = 'U'
		update tbl
		set
			[Field] = i.[field]
		from [B].[my].[table] tbl 
		inner join inserted i on i.[id] =  tbl.[id]




Вешаю триггер в базе b на таблицу my.table:
create trigger my.[tr_udi] on [my].[table]
   for insert, update, delete
as
set nocount on

declare	@action char(1)
select
   @action = case	when exists ( select
								 1
							  from
								 inserted )
					 and exists ( select
									1
								  from
									deleted ) then 'U'
				when exists ( select
								 1
							  from
								 inserted ) then 'I'
				else 'D'
		   end

-- Тут логируем и смотрим что вернет триггер: inserted, deleted
insert into dbo.t(n, [type])
select field, 'D' from deleted
union all
select field, 'I' from inserted



Теперь, если в базе a сделать update поля field:

update dbo.table
set
field = 'test'
where id = 123


то в таблице dbo.t будет пусто, т.е. inserted и deleted будут пустыми, хотя происходит изменение записи в таблице.
Подскажите пожалуйста, почему такое происходит.
22 июл 14, 14:05    [16341039]     Ответить | Цитировать Сообщить модератору
 Re: inserted и deleted пусты при изменении записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
хмхмхм,

интересно. UPDATE соответствует 'U'?
Почему же ожидается, что в t вставится либо 'I', либо 'D'?

Однако всё это неправильно, если INSERT или DELETE или UPDATE не затрагивают ни одной записи :((
У Вас получится почему-то 'D' в этом случае
22 июл 14, 14:14    [16341115]     Ответить | Цитировать Сообщить модератору
 Re: inserted и deleted пусты при изменении записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
хмхмхм,

интересно. UPDATE соответствует 'U'?
Почему же ожидается, что в t вставится либо 'I', либо 'D'?

Однако всё это неправильно, если INSERT или DELETE или UPDATE не затрагивают ни одной записи :((
У Вас получится почему-то 'D' в этом случае
Хотя нет! Вру!
SELECT из inserted и deleted в UNION ALL ничем не ограничен...

А объясняется всё просто. Апдейтите запись id = 123, а её нет!
22 июл 14, 14:16    [16341137]     Ответить | Цитировать Сообщить модератору
 Re: inserted и deleted пусты при изменении записи  [new]
msLex
Member

Откуда:
Сообщений: 8191
iap
iap
хмхмхм,

интересно. UPDATE соответствует 'U'?
Почему же ожидается, что в t вставится либо 'I', либо 'D'?

Однако всё это неправильно, если INSERT или DELETE или UPDATE не затрагивают ни одной записи :((
У Вас получится почему-то 'D' в этом случае
Хотя нет! Вру!
SELECT из inserted и deleted в UNION ALL ничем не ограничен...

А объясняется всё просто. Апдейтите запись id = 123, а её нет!

Причем достаточно чтобы ее не было в любой из двух таблиц [B].[my].[table], dbo.[table]
22 июл 14, 14:18    [16341153]     Ответить | Цитировать Сообщить модератору
 Re: inserted и deleted пусты при изменении записи  [new]
хмхмхм
Guest
iap
хмхмхм,

интересно. UPDATE соответствует 'U'?


Да, в переменной @action соответствует Update

iap
Почему же ожидается, что в t вставится либо 'I', либо 'D'?

Возможно немного ввел в заблуждение. В таблицу t вставляется либо данные из inserted, тогда мы помечаем их 'I', либо данные из deleted, тогда помечаем их 'D'.

iap
Однако всё это неправильно, если INSERT или DELETE или UPDATE не затрагивают ни одной записи :((
У Вас получится почему-то 'D' в этом случае

Хорошо, но как объяснить тот факт, что я меняю поле field у записи, в триггере в базе A все хорошо (есть и deleted и inserted), а в триггере в базе b пусто в обоих таблицах? Может быть у меня где-то нарушена логика в коде?
22 июл 14, 14:22    [16341183]     Ответить | Цитировать Сообщить модератору
 Re: inserted и deleted пусты при изменении записи  [new]
хмхмхм
Guest
Причем достаточно чтобы ее не было в любой из двух таблиц [B].[my].[table], dbo.[table][/quot]

Точно! Спасибо, её действительно нет в таблице B.my.table
22 июл 14, 14:24    [16341200]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить