Здравствуйте, Tanya, Вы писали:
T>Надо перевести хранимые процедуры с ORACLE на MS SQL 2000
T>Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().
T>Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.
T>Спасибо.
CREATE procedure [Owner].[Bla-bla-bla]
AS
declare @TranLevel INT
-- полный откат транзакции с возвратом исключения на клиента
SET XACT_ABORT ON
-- не возвращать клиенту инф. о количестве произведённых действий
SET NOCOUNT ON
-- переменная для проверки уровня вложенности транзакции
SET @TranLevel = @@TRANCOUNT
-- если больше 0, то ХП запущена в контексте транзакции
IF (@TranLevel > 0) GOTO proc_body
-- уровень изоляции транзакции ...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
-- стартовать транзакцию
BEGIN TRAN
proc_body:
------------
-- процедура
-- если понадобилась проверка с откатом
/*
IF (...) BEGIN
RAISERROR('Сообщение об ошибке', 16, 1)
ROLLBACK TRAN
RETURN -1
END
*/
IF (@TranLevel > 0) GOTO proc_exit
COMMIT TRAN
proc_exit:
GO
Такая конструкция, внесенная в каждую ХП обеспечит полный откат транзакции при каком-либо исключении на любом уровне вложенности. При этом, если исключение произойдет в spWriteLog, откатятся и все действия spWork. Если надо по другому, смотри "SAVE TRANSACTION" в BOL