トランザクションは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を使用しています。
これらのトリガーの自律型トランザクションコンテキストを自動的に取得します。
から - CREATE TRIGGER
ドキュメント:
トリガーを起動させることができるデータベースの1つ以上の特定の状態。特に明記されていない限り、DATABASEまたはSCHEMAでこれらのイベントのトリガーを作成できます。これらのトリガーイベントごとに、データベースは自律型トランザクションスコープを開き、トリガーを起動し、(既存のユーザートランザクションに関係なく)個別のトランザクションをコミットします。 。
トリガーが失敗した場合の動作は、正確なトリガー/イベントによって異なります。 トリガーでの例外処理 を参照してください。特に、例外で失敗するログオントリガーは、dba以外のユーザーを非常にロックアウトする可能性があります。ユーザーが特定の特権を持たない限り、例外によりログインが失敗します。