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ところ、値が返されました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;

私が確立できる 1 つの事実: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$transactionとしてクエリを実行できましたが、別のユーザーSYSTEMに対して十分な権限がありませんでした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 に答える