我想在触发器中使用事务的名称,以便将其写入列中。
我尝试了这个(在 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.
如何获取指定交易的名称?
我刚刚尝试过类似的事情,并且对于DBMS_TRANSACTION.LOCAL_TRANSACTION_ID
我找回了价值9.7.1270
。当我按名称查找交易时,发现以下内容:
v$transaction.XIDUSN = 9
v$transaction.XIDSLOT = 7
v$transaction.XIDSQN = 1270
把它们放在一起,你就得到了9.7.1270
。所以(请注意,这可能是错误的 - 我发现的文档没有涵盖这一点),你may能够获取当前交易名称,如下所示:
SELECT Name
FROM v$transaction
WHERE xidusn ||'.'|| xidslot ||'.'|| xidsqn = DBMS_TRANSACTION.LOCAL_TRANSACTION_ID;
我可以确定的一个事实是:v$transaction
在执行以下操作之一之前,行不会显示:
- INSERT/UPDATE/DELETE/MERGE 类型的操作,or
- Call
DBMS_TRANSACTION.LOCAL_TRANSACTION_ID
在其自己的- 这意味着仅仅将其放在上面的查询中似乎不足以填充v$transaction
row.
但是,如果我执行上述任一操作,查询就会起作用(我现在已经测试了 4 或 5 次),并且由于您将在触发器中尝试它,因此您应该被上面的第 2 项涵盖。
最后一点:v$transaction
访问受到相当限制,因此大多数用户将无法看到它。让事情变得复杂化,v$transaction
不是实际视图;它是视图的同义词sys.v_$transaction
(请注意美元符号之前的下划线),这就是您在授予时需要使用的名称。我很确定您必须以以下身份登录SYSDBA
进行拨款 - 我能够查询v$transaction
as the SYSTEM
用户,但我没有足够的权限GRANT SELECT
给另一个用户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)