2

我想在触发器中使用事务的名称,以便将其写入列。

我试过这个(在 SQL Developer 中):

set transaction name 'hello';
select DBMS_TRANSACTION.LOCAL_TRANSACTION_ID from dual;
commit;

但我得到的不是交易名称,而是某种随机值:

transaction NAME succeeded.
SUBSTR(DBMS_TRANSACTION.LOCAL_TRANSACTION_ID,0,20)
--------------------------------------------------
1.25.19794                                         

committed.

如何获取命名事务的名称?

4

2 回答 2

2

我只是尝试了类似的东西,并且DBMS_TRANSACTION.LOCAL_TRANSACTION_ID我得到了 value 9.7.1270。当我按名称查找交易时,我发现以下内容:

  • v$transaction.XIDUSN = 9
  • v$transaction.XIDSLOT = 7
  • v$transaction.XIDSQN = 1270

把它们放在一起,你就得到了9.7.1270。因此(请注意,这可能是错误的——我发现的文档没有涵盖这一点),您可能能够像这样获得当前的交易名称:

SELECT Name
FROM v$transaction
WHERE xidusn ||'.'|| xidslot ||'.'|| xidsqn = DBMS_TRANSACTION.LOCAL_TRANSACTION_ID;

我可以确定的一个事实:在v$transaction您执行以下操作之一之前,该行不会显示:

  1. INSERT/UPDATE/DELETE/MERGE 类型的操作,
  2. DBMS_TRANSACTION.LOCAL_TRANSACTION_ID 单独调用- 这意味着仅在上面的查询中使用它似乎不足以填充该v$transaction行。

但是,如果我执行上述任一操作,则查询可以正常工作(我现在已经测试了 4 或 5 次),并且由于您将在触发器中尝试它,因此上面的第 2 项应涵盖。

最后一点:v$transaction访问受到相当限制,因此大多数用户将无法看到它。使事情复杂化v$transaction的不是实际的观点;它是视图的同义词sys.v_$transaction(注意美元符号前的下划线),因此这是您在授予时需要使用的名称。而且我很确定您必须登录SYSDBA才能进行授权 - 我能够以用户身份进行查询v$transactionSYSTEM但我没有足够的权限GRANT SELECT访问另一个用户。

于 2013-07-17T17:08:01.790 回答
1

我认为您正在寻找 v$transaction。例如:

set serveroutput on
set echo on
set transaction name 'test1_txn';
update my_table set dte = sysdate;
-- this will show the named transaction
select * from v$transaction where name = 'test1_txn';
commit;
-- after commit, won't show
select * from v$transaction where name = 'test1_txn';

更多细节在这里

于 2013-07-17T16:36:03.517 回答