Как установить «SET XACT_ABORT ON» в транзакции SQL Server? - PullRequest
4 голосов
/ 06 ноября 2011

Я хочу установить SET XACT_ABORT ON в хранимой процедуре SQL Server 2008R2 с транзакцией, поэтому сделайте это в скрипте создания:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET XACT_ABORT ON
GO

CREATE PROCEDURE MyProc
AS
BEGIN TRAN  
    ... 
IF @@ERROR <> 0
BEGIN
    GOTO Done
END 
    ... 
IF @@ERROR <> 0
BEGIN
    GOTO Done
END 
COMMIT TRAN     
Done:
IF @@ERROR <> 0
BEGIN
    ROLLBACK TRAN
END
GO

После успешного создания я проверяю транзакцию, нажимая «Изменить»"опция хранимой процедуры и в сгенерированном ALTER PROCEDURE сценарии я не вижу SET XACT_ABORT ON строки:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE MyProc
AS
BEGIN TRAN
...

Где я ошибаюсь или в чем хитрость?Как правильно определить SET XACT_ABORT ON?

Ответы [ 2 ]

6 голосов
/ 06 ноября 2011

Обычно вы устанавливаете xact_abort как часть тела хранимой процедуры:

CREATE PROCEDURE MyProc
AS
SET XACT_ABORT ON
BEGIN TRAN  
....

Есть две «специальные» настройки, которые запоминаются из сеанса, который создал процедуру. Объяснение из MSDN:

Хранимые процедуры выполняются с настройками SET, указанными во время выполнения, за исключением SET ANSI_NULLS и SET QUOTED_IDENTIFIER.Хранимые процедуры, указывающие SET ANSI_NULLS или SET QUOTED_IDENTIFIER, используют настройку, указанную во время создания хранимой процедуры.При использовании внутри хранимой процедуры любой параметр SET игнорируется.

Таким образом, при создании хранимой процедуры SQL Server копирует параметр QUOTED_IDENTIFIER из соединения в определение процедуры.Цель состоит в том, чтобы кто-то другой с другим параметром QUOTED_IDENTIFIER по-прежнему получал поведение, намеченное автором процедуры.

То же самое не относится к XACT_ABORT.

0 голосов
/ 06 ноября 2011

Вы не упомянули, используете ли вы SQL Management Studio или нет, но если вы это сделаете и нажмете «Изменить» в существующей хранимой процедуре (я полагаю, это то, что вы сделали), то MS просто генерирует шаблонный сценарий на основе содержимого существующей хранимой процедуры.

Вы можете рассмотреть возможность определения своих хранимых процедур в отдельном файле сценария, который выполняет и ALTER PROCEDURE, а также любые другие параметры, которые вы хотите вне sproc (например, SET XACT_ABORT ON). Таким образом, вы получаете больше контроля и можете просто выполнить скрипт для обновления sproc.

...