powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / An error was raised during trigger execution. The batch has been aborted and the user tran
21 сообщений из 21, страница 1 из 1
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979072
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть процедура с простым апдейтом

на таблице есть триггер на апдейт
внутри курсор и вызов несколько процедур для строк курсора

коммитов и роллбеков внутри триггера и процедур нет

У некоторые юзеров вылетает ошибка:
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.

подскажите
как такую ошибку отловить, где можно найти реальный текст ошибки
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979077
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
есть процедура с простым апдейтом

на таблице есть триггер на апдейт
внутри курсор и вызов несколько процедур для строк курсора

коммитов и роллбеков внутри триггера и процедур нет

У некоторые юзеров вылетает ошибка:
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.

подскажите
как такую ошибку отловить, где можно найти реальный текст ошибки


Отсюда смотреть
"An error was raised during trigger execution. "

А там - если несколько процедур и т.д, ловятся ли в них ошибки? если нет - ставьте ловлю и т.д.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979081
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Отсюда смотреть
"An error was raised during trigger execution. "

А там - если несколько процедур и т.д, ловятся ли в них ошибки? если нет - ставьте ловлю и т.д.


правильно ли я понял
что ловля ошибок в триггерах - дело творческое
и оригинальный текст ошибки взять негде на верхнем уровне?

mssql-2017
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979082
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело осложняется тем, что на дев среде не воспроизводится ошибка
а на проде тоже не у всех
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979095
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

В какой-то из процедур гасится исключение
Если это исключение не переводит транзакцию в нефиксируемое состояние, то поможет set xact_abort off в начале триггера.

А по-хорошему - надо найти гасильщика исключений и уволить его.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979113
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сдается мне, надо искать CATCH без корректной обработки ошибки
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979124
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

В процедурах должен быть обработчик try catch? В каждой процедуре. Если настроить обработчик на суммирование теста ошибки, название процедуры, номера строки и пробрасывать наверх этот текст, то получите стек выполнения. Дальше будет просто обнаружить точное место появления ошибки.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979234
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
andreymx,

В процедурах должен быть обработчик try catch? В каждой процедуре. Если настроить обработчик на суммирование теста ошибки, название процедуры, номера строки и пробрасывать наверх этот текст, то получите стек выполнения. Дальше будет просто обнаружить точное место появления ошибки.
почему-то мне кажется, что ошибка вида "An error was raised during trigger execution. The batch has been aborted and the user..." перекроет все эти обработчики
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979241
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

в упрощенном виде выглядит так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
USE [tempdb];
GO
BEGIN TRAN;

CREATE TABLE dbo.t1(
f1 INT);
GO

CREATE TRIGGER trigger1 ON dbo.t1
AFTER INSERT
AS
BEGIN
	;THROW 50000, 'bad', 1;
END;
GO
CREATE PROC dbo.pr1
AS
BEGIN
	BEGIN TRY
		DECLARE @trancnt INT = @@tranCount;
		INSERT dbo.t1(f1)
		VALUES(1);
	END TRY
	BEGIN CATCH
		IF @trancnt = 0
		   AND @@tranCount > 0
			ROLLBACK;
		DECLARE @errorText VARCHAR(4000) = ERROR_MESSAGE(),
				@state TINYINT = ERROR_STATE(),
				@errorNumber BIGINT = ERROR_NUMBER();

		SET @errorText = CONCAT(@errorText, ' ПРОЦ:', ERROR_PROCEDURE(), ', СТРК:', ERROR_LINE(), '; ');
		THROW @errorNumber, @errorText, @state;
	END CATCH;
END;
GO
CREATE PROC dbo.pr2
AS
BEGIN
	BEGIN TRY
		DECLARE @trancnt INT = @@tranCount;
		EXEC dbo.pr1;
	END TRY
	BEGIN CATCH
		IF @trancnt = 0
		   AND @@tranCount > 0
			ROLLBACK;
		DECLARE @errorText VARCHAR(4000) = ERROR_MESSAGE(),
				@state TINYINT = ERROR_STATE(),
				@errorNumber BIGINT = ERROR_NUMBER();

		SET @errorText = CONCAT(@errorText, ' ПРОЦ:', ERROR_PROCEDURE(), ', СТРК:', ERROR_LINE(), '; ');
		THROW @errorNumber, @errorText, @state;
	END CATCH;
END;
GO

BEGIN TRY
	EXEC dbo.pr2;
END TRY
BEGIN CATCH
	ROLLBACK;
	THROW;
END CATCH;

...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979251
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
catch без throw в триггере приводит к такой ошибке
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
ALTER TRIGGER [dbo].[test_AU1]
	ON [dbo].[test]
AFTER UPDATE
AS
declare @v_msg nvarchar(1000);

BEGIN try
    set @v_msg = '1234' + getdate()
END try 
begin CATCH
    set @v_msg = ERROR_MESSAGE()
    print @v_msg;
END CATCH ;


update dbo.test set test_name=test_name


The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Сообщение 3616, уровень 16, состояние 1, строка 3
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.




дело усугубилось тем, что в кетче был еще и EXEC msdb.dbo.sp_send_dbmail
что приводило еще и к другим ошибкам (ошибки остались за пределами текущего топика)


всем большое спасибо
буду ковырять дальше
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979282
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
catch без throw в триггере приводит к такой ошибке

catch без throw тут дело пятое. Просто ошибка переводит транзакцию в нефиксируемое состояние:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table test.tb_test(n int)
go
create trigger test.tr_test_insert on test.tb_test after  insert as
begin
  print 'xact_state()='+convert(varchar, xact_state());
  begin try
    declare
      @s nvarchar(2000);
    set @s='123'+getdate();
  end try
  begin catch
    print 'Oops! '+error_message();
    print 'xact_state()='+convert(varchar, xact_state());
  end catch
end;
go
insert into test.tb_test values(0);
go


Код: plaintext
1.
2.
3.
4.
xact_state()=1
Oops! Conversion failed when converting date and/or time from character string.
xact_state()=-1
Msg 3616, Level 16, State 1, Line 23
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.

И получается, что в триггерах begin try/end try/begin catch/end catch особенного практического значения не имеют.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979337
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
catch без throw тут дело пятое.
если сделать кетч плюс throw с error message, то наверх выдастя более понятная ошибка
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979351
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
И получается, что в триггерах begin try/end try/begin catch/end catch особенного практического значения не имеют.
В триггере по дефолту включено set xact_abort on.
Если в начале выставить в off, то поведение изменится.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979354
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
В триггере по дефолту включено set xact_abort on.
Если в начале выставить в off, то поведение изменится.

Я тоже читал про такой совет. У меня почему-то это выглядит вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
alter trigger test.tr_test_insert on test.tb_test after  insert as
begin
  set xact_abort off;
  print 'xact_state()='+convert(varchar, xact_state());
  begin try
    declare
      @s nvarchar(2000);
    set @s='123'+getdate();
  end try
  begin catch
    print 'Oops! '+error_message();
    print 'xact_state()='+convert(varchar, xact_state());
  end catch
  set xact_abort on;
end;
go

insert into test.tb_test values(0);
go

Код: plaintext
1.
2.
3.
4.
xact_state()=1
Oops! Conversion failed when converting date and/or time from character string.
xact_state()=-1
Msg 3616, Level 16, State 1, Line 23
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.
Пробовал на 2014-м сервере.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979356
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Код: sql
1.
дело усугубилось тем, что в кетче был еще и EXEC msdb.dbo.sp_send_dbmail



это явно рискованное решение, т.к. при откате, возможно, откатится и письмо. И вообще несвойственная триггеру операция. Используйте в триггере для уведомлений механизм event notification, который работает вне транзакции + sp_trace_generateevent.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979368
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

В try/catch
когда xact_abort = on все ошибки переводят транзакцию в нефиксируемое состояние
когда xact_abort = off только batch terminating ошибки переводят транзакцию в нефиксируемое состояние

Ошибка конвертации как раз относится к batch terminating
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979377
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
andreymx,

Код: sql
1.
дело усугубилось тем, что в кетче был еще и EXEC msdb.dbo.sp_send_dbmail



это явно рискованное решение, т.к. при откате, возможно, откатится и письмо. И вообще несвойственная триггеру операция. Используйте в триггере для уведомлений механизм event notification, который работает вне транзакции + sp_trace_generateevent.
спасибо
Буду читать
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979379
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
andreymx,

Код: sql
1.
дело усугубилось тем, что в кетче был еще и EXEC msdb.dbo.sp_send_dbmail




это явно рискованное решение, т.к. при откате, возможно, откатится и письмо. И вообще несвойственная триггеру операция. Используйте в триггере для уведомлений механизм event notification, который работает вне транзакции + sp_trace_generateevent.
кстати, в оракле наоборот
надо было НЕ отправлять письмо, если не зафиксирована транзакция
а там рассылка почты нетранзакционная
тоже накручивали разное
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979434
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
при откате, возможно, откатится и письмо.

Вот даже интересно было бы посмотреть на реализацию. Особенно, если пакеты по smtp уже ушли.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979474
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

насколько я помню, отсылка происходит не мгновенно, а внешним приложением, которое читает данные письма из таблиц по внутреннему расписанию. Таблицы, конечно же, подвержены действию транзакционного механизма.
...
Рейтинг: 0 / 0
An error was raised during trigger execution. The batch has been aborted and the user tran
    #39979478
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Вот даже интересно было бы посмотреть на реализацию.
Через брокер реализовано.
Так что пакеты никуда не уходят - их еще нет.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / An error was raised during trigger execution. The batch has been aborted and the user tran
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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