如何获取导致触发器的事务的Oracle事务id

时间:2013-08-30 13:47:40

标签: sql oracle

假设我有一个名为“用户”的表。我有一个触发器,触发插入“用户”表。 有没有办法在触发器内获取插入的事务ID?

2 个答案:

答案 0 :(得分:4)

您可以使用dbms_transaction.local_transaction_id

功能

以下是一个例子:(取自here

SELECT dbms_transaction.local_transaction_id
FROM dual;

CREATE TABLE t (
testcol NUMBER(3));

INSERT INTO t
VALUES (1);

SELECT dbms_transaction.local_transaction_id
FROM dual;

CREATE OR REPLACE FUNCTION atf RETURN VARCHAR2 IS
 PRAGMA AUTONOMOUS_TRANSACTION;
 x VARCHAR2(20);
BEGIN
  INSERT INTO t
  (testcol)
  VALUES
  (2);

  x := dbms_transaction.local_transaction_id;
  COMMIT;

  RETURN x;
END atf;
/

set serveroutput on

DECLARE
 x VARCHAR2(20);
BEGIN
  x := atf;
  dbms_output.put_line(x);

  INSERT INTO t VALUES (3);

  x := dbms_transaction.local_transaction_id;
  dbms_output.put_line(x);
  COMMIT;
END;
/

答案 1 :(得分:0)

使用Oracle时,必须执行以下SQL查询:

SELECT tx.xid
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr

v$transaction视图提供有关当前正在运行的数据库事务的信息。但是,我们的系统中可能有多个交易正在运行,这就是为什么我们将v$transactionv$session视图结合在一起。

v$session视图提供有关我们当前会话或数据库连接的信息。通过在v$transactionv$session视图之间匹配会话地址,我们可以在xid视图中的v$transaction列中找到当前正在运行的事务标识符。

请注意,Oracle仅在需要分配undo segment时才分配事务标识符,这意味着已经执行了INSERT,UPDATE或DELETE DML语句。

因此,只读事务将不会分配事务标识符。

有关此主题的更多详细信息,请查看this article