web-dev-qa-db-ja.com

データベーストリガーでCOMMITする必要がないのはなぜですか?

トランザクションはDMLステートメントの後で手動で処理されるため、DMLトリガーでCOMMIT/ROLLBACKを実行することはできません。ただし、データベーストリガーは例外のようです。たとえば、データベーストリガーがあるとします。

CREATE OR REPLACE TRIGGER user_login_as
  AFTER LOGON 
    ON SCHEMA
BEGIN
  INSERT INTO user_login_log(username, log_date, action) VALUES (user, sysdate, 'User has logged in');
END user_login_as;

トリガーには、その内部にコミットがある自律型トランザクションプロシージャが含まれていないので、誰が挿入をコミットしていますか?このトリガーはチャームのように機能し、ユーザーのログオン後に新しいレコードをログテーブルに挿入します。それは隠されたOracleの機能のようなにおいがし、それに関するOracleのドキュメントで参照を見つけることができません。 Oracle11gを使用しています。

7
Centurion

これらのトリガーの自律型トランザクションコンテキストを自動的に取得します。

から - CREATE TRIGGER ドキュメント:

トリガーを起動させることができるデータベースの1つ以上の特定の状態。特に明記されていない限り、DATABASEまたはSCHEMAでこれらのイベントのトリガーを作成できます。これらのトリガーイベントごとに、データベースは自律型トランザクションスコープを開き、トリガーを起動し、(既存のユーザートランザクションに関係なく)個別のトランザクションをコミットします。 。

トリガーが失敗した場合の動作は、正確なトリガー/イベントによって異なります。 トリガーでの例外処理 を参照してください。特に、例外で失敗するログオントリガーは、dba以外のユーザーを非常にロックアウトする可能性があります。ユーザーが特定の特権を持たない限り、例外によりログインが失敗します。

13
Mat