这是一个非常有趣的话题,因此让我们检查一下MS如何处理它。
第一份文档:将Oracle迁移到SQL Server-2014-和-Azure-SQL- DB.pdf
第152页。
本部分描述了SSMA for Oracle V6.0如何处理自主事务(PRAGMA AUTONOMOUS_TRANSACTION)。这些自主事务在Microsoft sql Server 2014中没有直接等效项。
当您将PL / sql块(匿名块,过程,函数,打包过程,打包函数,数据库触发器)定义为自主事务时,会将该块中的DML与调用者的事务上下文隔离。该块成为由另一个事务(称为主事务)启动的独立事务。
要将PL / sql块标记为自主事务,只需在声明部分中包含以下语句:PRAGMA AUTONOMOUS_TRANSACTION;
使用 扩展过程及其与SSMA 6.0 Extension Pack捆绑在一起的扩展版本 打开新事务。该过程的目的是在新连接中调用任何存储过程,并帮助在函数体内调用存储过程。xp_ora2ms_exec2过程具有以下语法:
xp_ora2ms_exec2
<active_spid> int,
<login_time> datetime,
<ms_db_name> varchar,
<ms_schema_name> varchar,
<ms_procedure_name> varchar,
<bind_to_transaction_flag> varchar,
[optional_parameters_for_procedure];
然后,您需要在服务器上安装存储过程和其他脚本: 适用于Oracle Extension Pack的SSMA(仅适用于Oracle Extension Pack.7.5.0.msi的SSMA)。
您的存储过程将变为:
CREATE TABLE myLogTable(i INT IDENTITY(1,1),
d DATETIME DEFAULT GETDATE(),
t NVARCHAR(1000));
GO
CREATE OR ALTER PROCEDURE my_logging
@t NVARCHAR(MAX)
AS
BEGIN
INSERT INTO myLogTable(t) VALUES (@t);
END;
GO
CREATE OR ALTER PROCEDURE myStoredProcedure
AS
BEGIN
-- some work
SELECT 1;
INSERT INTO myLogTable(t)
VALUES ('Standard logging that will perish after rollback');
DECLARE @login_time DATETIME = GETDATE();
DECLARE @custom_text_to_log NVARCHAR(100);
SET @custom_text_to_log=N'some custom loging that should survive rollback';
DECLARE @database_name SYSNAME = DB_NAME();
EXEC master.dbo.xp_ora2ms_exec2_ex
@@spid,
@login_time,
@database_name,
'dbo',
'my_logging',
'N',
@custom_text_to_log;
END;
最后的电话:
begin transaction
exec myStoredProcedure
rollback transaction
select * from myLogTable;
输出:
i d t
2 2017-08-21 some custom loging that should survive rollback