Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
Добрый день.
Для таблицы реализован триггер на операции insert, update.
Смысл триггера следующий, берем все записи из таблицы inserted группируем их и вставляем в другую таблицу с определенными полями, в случае если совпадение есть и доп условие отрабатывает, тогда выполняем апдейт.
Но столкнулся с проблемой, что не всегда все записи "инсертятся" в другую таблицу.
Данные импортируются в таблицу как через джоб, где реализовано большое количество степов, так и вручную.
Причем если были пропуски и запустить операцию еще раз по пропущенным записям все пройдет успешно.

Текст триггера:

if @@rowcount = 0 return;
set nocount on;
	
merge tblArchivedDebts_OSD trg
using (select i.DebtDate, i.Cust_id, getDate() Dlm, 0 IsCopied 
         from inserted i 
	group by i.DebtDate, i.Cust_id) src on src.Cust_id = trg.Cust_id and src.DebtDate = trg.DebtDate
when matched and trg.IsCopied = 1 then
    update
    set trg.IsCopied = 0
       , trg.SyncDate = src.Dlm
when not matched then
    insert (Cust_id, DebtDate, SyncDate, IsCopied)
    values (src.Cust_id, src.DebtDate, src.Dlm, src.IsCopied);
17 янв 17, 15:06    [20114623]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
aleks2
Guest
if @@rowcount = 0 return;


шо за бред?

if not exists( select * from inserted ) return;
17 янв 17, 15:40    [20114853]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
aleks2,
Это никаким образом не влияет на данную проблему.
Изначально был вообще просто скрипт из двух инструкций апдейт и инсерт
17 янв 17, 16:15    [20115058]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
a.boyarchuk
aleks2,
Это никаким образом не влияет на данную проблему.
Изначально был вообще просто скрипт из двух инструкций апдейт и инсерт

1. при определённых обстоятельствах очень даже влияет
2. Если даже при "двух инструкций апдейт и инсерт" не отрабатывало, смотрите на триггеры таблицы получатеоля
17 янв 17, 16:22    [20115095]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
TaPaK,
На получателе триггеров нет
17 янв 17, 16:25    [20115117]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
Повторюсь, триггер отрабатывает, но не всегда именно все записи записываются в таблицу получателя.
Но если выполнить операцию еще раз, все записывается без пропусков.
17 янв 17, 16:27    [20115131]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
a.boyarchuk
Повторюсь, триггер отрабатывает, но не всегда именно все записи записываются в таблицу получателя.
Но если выполнить операцию еще раз, все записывается без пропусков.

ещё раз: триггеры на получателе есть?
17 янв 17, 16:31    [20115159]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
TaPaK,

Триггер установлен на таблице 1, где выполняется выборка данных из таблицы инсертед с группировкой и результат вставляется/обновляется в таблицу 2.
На таблице 2 триггеров нет
17 янв 17, 16:36    [20115187]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
a.boyarchuk
Повторюсь, триггер отрабатывает, но не всегда именно все записи записываются в таблицу получателя.
Чудес не бывает. Сервер не пропускает строки при вставке по собственной инициативе.
Анализируйте что приходит в inserted. И что уходит из merge с помощью предложения output.
17 янв 17, 16:38    [20115194]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
a.boyarchuk
TaPaK,

Триггер установлен на таблице 1, где выполняется выборка данных из таблицы инсертед с группировкой и результат вставляется/обновляется в таблицу 2.
На таблице 2 триггеров нет

ну вы внимательно посмотрите на вторую таблицу, может не плохо смотрите :) и полный скрипт триггера
17 янв 17, 16:39    [20115205]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
a.boyarchuk,

Cust_id + DebtDate уникальные? а то вообще фигня получается ) и в результате ваши повторные проходы срабатывают
17 янв 17, 16:48    [20115244]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
a.boyarchuk,

and src.DebtDate = trg.DebtDate


вот тут у вас проблема, стеклянный шар не врет:)
тип поля какой в обеих таблицах?
17 янв 17, 16:55    [20115285]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
WarAnt,

Тип поля Date.
Почему там проблема, ведь времени там нету?
17 янв 17, 17:03    [20115318]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
TaPaK,

Смотрел внимательно на таблице 2 триггеров нету :)
В первом сообщении и есть весь триггер, разве что не хватает этого
ALTER TRIGGER [dbo].[Filling_tblArchivedDebts_OSD] ON [dbo].[tblArchivedDebts]
AFTER INSERT, UPDATE
AS 
BEGIN
.............
END
17 янв 17, 17:05    [20115329]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
TaPaK
a.boyarchuk,

Cust_id + DebtDate уникальные? а то вообще фигня получается ) и в результате ваши повторные проходы срабатывают


Нет, значения повторяются, именно поэтому и делается группировка
17 янв 17, 17:07    [20115342]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
a.boyarchuk,

в конкретный код вникать не хочу, но у вас просто проблема с отладкой триггера
надо наработать методы отладки и сами все решите
вставляйте селекты и принты чтобы снаружи увидеть на каких данных выполняется ваш мерж
или выведите inserted deleted во внешние таблицы чтобы потом смоделировать
сам триггер безусловно и надежно делает только то что вы в нем напишете
исключений никогда не встречал
хотя однажды еще на версии 6.5 видел падение в триггере при использовании временных таблиц под транзакцией,
но это уже предания старины глубокой
17 янв 17, 17:16    [20115395]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
a.boyarchuk
TaPaK
a.boyarchuk,

Cust_id + DebtDate уникальные? а то вообще фигня получается ) и в результате ваши повторные проходы срабатывают


Нет, значения повторяются, именно поэтому и делается группировка

хороший стеклянный шар это нынче роскошь...

IsCopied = 1 откуда вообще в таблице tblArchivedDebts_OSD берётся?
17 янв 17, 17:20    [20115412]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31780
leov
у вас просто проблема с отладкой триггера
надо наработать методы отладки и сами все решите
+1
Очевидно же, merge написан неправильно.

a.boyarchuk
столкнулся с проблемой, что не всегда все записи "инсертятся" в другую таблицу.
Вот нужно для начала понять, при каких сочетаниях существующих и изменяемых данных проявляется эта ошибка.
Сделать скрипт с begin tran - rollback tran, повторяющий эту ошибку
Навставлять отладочных выводов (благо пока ещё не запретили это, как планируют :-) )
И всё станет понятно.

А так сложно разобраться.

Или, если разбираться неохота/некогда замените merge на insert - update, это точно будет проще правильно написать.
17 янв 17, 17:25    [20115441]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
TaPaK
a.boyarchuk
пропущено...


Нет, значения повторяются, именно поэтому и делается группировка

хороший стеклянный шар это нынче роскошь...

IsCopied = 1 откуда вообще в таблице tblArchivedDebts_OSD берётся?


IsCopied = 1 это уже другая история. Если вкратце это делает другой процесс/сервис.
17 янв 17, 17:40    [20115515]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
a.boyarchuk
Member

Откуда:
Сообщений: 13
alexeyvg
leov
у вас просто проблема с отладкой триггера
надо наработать методы отладки и сами все решите
+1
Очевидно же, merge написан неправильно.

a.boyarchuk
столкнулся с проблемой, что не всегда все записи "инсертятся" в другую таблицу.
Вот нужно для начала понять, при каких сочетаниях существующих и изменяемых данных проявляется эта ошибка.
Сделать скрипт с begin tran - rollback tran, повторяющий эту ошибку
Навставлять отладочных выводов (благо пока ещё не запретили это, как планируют :-) )
И всё станет понятно.

А так сложно разобраться.

Или, если разбираться неохота/некогда замените merge на insert - update, это точно будет проще правильно написать.


Изначально и было просто две конструкции инсерт и апдейт
17 янв 17, 17:41    [20115522]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
Заинтересовал
Guest
TaPaK
1. при определённых обстоятельствах очень даже влияет

Например?
17 янв 17, 17:42    [20115530]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Заинтересовал
TaPaK
1. при определённых обстоятельствах очень даже влияет

Например?

например перед этим триггером есть ISTEAD OF
17 янв 17, 17:48    [20115556]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
Заинтересовал
Guest
TaPaK
Заинтересовал
пропущено...

Например?

например перед этим триггером есть ISTEAD OF

А демкой не поделитесь? где срабатывает not exists и не срабатывает @@rowcount, а то у меня не выходит.
+

create table  dbo.t1(
id int not null,
fname varchar(20) not null
)
go

create trigger tr_iof_t1 on dbo.t1
instead of insert,update as
begin
	declare @rcnt int = @@rowcount;
	set nocount on;
	print 'iof @@rowcount='+ cast(@rcnt as varchar);

	if not exists (select 1 from inserted) begin
		print 'iof not exists complite';
	end;
	
	if @rcnt = 0 begin
		print 'iof @@rowcount = 0 compile';
	end;

	insert dbo.t1(id,fname)
	select id,fname
	from inserted
	where id < 10
end
go

create trigger tr_iu_t1 on dbo.t1
after insert, update 
as 
begin
	declare @rcnt int = @@rowcount;
	set nocount on;
	print 'iu @@rowcount='+ cast(@rcnt as varchar);

	if not exists (select 1 from inserted) begin
		print 'iu not exists complite';
	end;
	
	if @rcnt = 0 begin
		print 'iu @@rowcount = 0 compile';
	end;
end
go

EXEC sp_settriggerorder @triggername=N'[dbo].[tr_iu_t1]', @order=N'Last', @stmttype=N'INSERT'
GO
EXEC sp_settriggerorder @triggername=N'[dbo].[tr_iu_t1]', @order=N'Last', @stmttype=N'UPDATE'
GO

insert into  dbo.t1(id,fname)
values (1,'fa')

insert into  dbo.t1(id,fname)
values (11,'fa')
go

17 янв 17, 18:22    [20115675]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Заинтересовал,

виноват, нельзя обойти :)
17 янв 17, 18:48    [20115755]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на insert, update  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Заинтересовал
а то у меня не выходит
instead of ни при чем. Различие будет при merge.
use tempdb;
go

create table dbo.t (id int primary key, v int);
insert into dbo.t values (1, 1);
go

create trigger dbo.tr_t
on dbo.t
after insert, update
as
begin
 select @@rowcount as [@@rowcount], count(*) as [count(*) from inserted] from inserted;
end;
go

merge into dbo.t
using (values (2, 2)) s(id, v) on s.id = t.id
when matched then
 update
  set v = s.v
when not matched by source then
 delete;
go

drop table dbo.t;
go
17 янв 17, 18:49    [20115761]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить