Надо перевести хранимые процедуры с ORACLE на MS SQL 2000
Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().
Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.
Здравствуйте, Tanya, Вы писали:
T>Надо перевести хранимые процедуры с ORACLE на MS SQL 2000 T>Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().
T>Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.
T>Спасибо.
нет таких транзакций в MS SQL.
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Tanya wrote: > Надо перевести хранимые процедуры с ORACLE на MS SQL 2000 > Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog(). > > Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат. > > Спасибо. тут
Здравствуйте, Козьма Прутков, Вы писали:
КП>Tanya wrote: >> Надо перевести хранимые процедуры с ORACLE на MS SQL 2000 >> Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog(). >> >> Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат. >> >> Спасибо. КП>тут
Здравствуйте, 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
Работает процедура в транзакции, чего-то делает, надо вести протокол,
чего ни делай — если внешняя транзакция откатится, весь протокол потерян.
Варианты решения в принципе таковы
— сохранять данные в локальной переменной и после завершения транзакции инсертить их в таблицу
— писать extended SP, которая откроет свой независимый коннект и все операции через него
будут "автономными"
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Здравствуйте, ksg71, Вы писали: K>Варианты решения в принципе таковы
K>- сохранять данные в локальной переменной и после завершения транзакции инсертить их в таблицу K>- писать extended SP, которая откроет свой независимый коннект и все операции через него K> будут "автономными"
Спасибо. Видимо действительно придется "выкручиваться". Эх, все-таки с MS SQL на ORACLE переводить на много легче, чем обратно...
Здравствуйте, Tanya, Вы писали:
T>Спасибо. Видимо действительно придется "выкручиваться". Эх, все-таки с MS SQL на ORACLE переводить на много легче, чем обратно...
Еще вариант — запоминать то что нужно записать в таблице-переменной. На нее rollback не действует.
Кстати, мне с MS SQL на Oracle было сложнее переходить чем обратно