我只是尝试了类似的东西,并且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
您执行以下操作之一之前,该行不会显示:
- INSERT/UPDATE/DELETE/MERGE 类型的操作,或
DBMS_TRANSACTION.LOCAL_TRANSACTION_ID
单独调用- 这意味着仅在上面的查询中使用它似乎不足以填充该v$transaction
行。
但是,如果我执行上述任一操作,则查询可以正常工作(我现在已经测试了 4 或 5 次),并且由于您将在触发器中尝试它,因此上面的第 2 项应涵盖。
最后一点:v$transaction
访问受到相当限制,因此大多数用户将无法看到它。使事情复杂化v$transaction
的不是实际的观点;它是视图的同义词sys.v_$transaction
(注意美元符号前的下划线),因此这是您在授予时需要使用的名称。而且我很确定您必须登录SYSDBA
才能进行授权 - 我能够以用户身份进行查询v$transaction
,SYSTEM
但我没有足够的权限GRANT SELECT
访问另一个用户。