トリガーの概要
トリガーは、データベースに保存される名前付きのpl / sqlブロックです。
- 自分でトリガーを呼び出すことはできません。トリガーは常に特定のイベントでのみ自動的に起動します(有効になっている場合)
- 再帰トリガーを作成しないでください。 つまり、たとえば、更新後のトリガーで、同じテーブルの更新が実行されます。 この場合、トリガーはメモリがなくなるまで再帰的に起動します。
トリガー分類:
- DMLトリガー(テーブルまたはビューごと)
- システムトリガー(回線またはデータベースごと)
- 条件付きトリガー(when条件を持つトリガー)
- トリガーの代わりに(作成コマンドのdmlビュートリガーまたはシステムトリガー)
トリガーを使用する理由:
- 仮想フィールド値を自動的に生成するには
- ロギング用
- 統計を収集するには
- ビューがdml操作に関係している場合、テーブルのデータを変更するには
- 特定の時間にdml操作を防ぐには
- テーブルの作成時に確立された記述的制約では実装できない複雑なデータ整合性制約を実装するには
- あらゆる種類の監査を整理するには
- データベース内の情報を変更した場合の対処方法について他のモジュールに通知するには
- ビジネスロジックを実装するには
- データベーステーブルでカスケードアクションを整理するため
- データベースまたはスキーマのシステムイベントに応答するには
plsql_trigger_sourceはそのような構成体です。
構文simple_dml_trigger、instead_of_dml_trigger、compound_dml_trigger 、 system_triggerは、記事の対応するセクションに記載されています。
DMLトリガー
- DMLトリガーは、テーブルまたはビューに対して作成され、レコードの挿入、更新、または削除時にトリガーされます。
- トリガーは、テーブルが定義されているスキーマとは異なるスキーマで作成できます。 この場合、トリガーを実行するときの現在の回路は、トリガー自体の回路と見なされます。
- MERGE操作は、行の操作に応じて、レコードを変更、挿入、または削除するトリガーをトリガーします。
- トリガーはトランザクションの一部であり、トリガーのエラーは操作をロールバックし、トリガーのテーブル変更はトランザクションの一部になります。
- トランザクションがロールバックされると、トリガーの変更もロールバックされます。
- トリガーでは、DDLおよびトランザクション管理ステートメントは禁止されています(例外はスタンドアロントランザクションです)。
Simple_dml_triggerコンストラクト:
ここで、 dml_event_clause:
referencing_clause:
trigger_edition_clause:
trigger_body:
添付オブジェクトに応じて、次のように分類されます。
- テーブルの上
- ビュー内(トリガーの代わり)
起動イベント別:
- レコードの挿入(挿入)
- レコードの更新(更新)
- レコードを削除(削除)
スコープ別:
- チームレベル(ステートメントレベルのトリガー)
- 行レベルのトリガー
- 複合トリガー
応答時間別:
- 操作前(前)
- 操作後(後)
クロスエディショントリガー - エディション間の相互作用に使用されます。たとえば、新しいエディションにないフィールドから他のフィールドにデータを転送および変換します。
トリガーが機能した操作を決定する条件述語:
述語 | 説明 |
---|---|
挿入 | 挿入操作でトリガーが起動した場合はTrue |
更新中 | 更新操作でトリガーが起動した場合はTrue |
更新(「列」) | 特定のフィールドに影響する更新操作でトリガーが起動した場合はTrue |
削除中 | 削除操作でトリガーが起動された場合はTrue |
これらの述語は、ブール式を使用できる場所であればどこでも使用できます。
例
CREATE OR REPLACE TRIGGER t BEFORE INSERT OR UPDATE OF salary, department_id OR DELETE ON employees BEGIN CASE WHEN INSERTING THEN DBMS_OUTPUT.PUT_LINE('Inserting'); WHEN UPDATING('salary') THEN DBMS_OUTPUT.PUT_LINE('Updating salary'); WHEN UPDATING('department_id') THEN DBMS_OUTPUT.PUT_LINE('Updating department ID'); WHEN DELETING THEN DBMS_OUTPUT.PUT_LINE('Deleting'); END CASE; END;
擬似テープ
変更されるレコードのフィールドにアクセスし、変更前のフィールドの値と変更後のフィールドの値を取得できる疑似レコードがあります。 これらは、古いエントリと新しいエントリです。 参照構造を使用して、名前を変更できます。 これらのエントリの構造は、tablename%rowtypeです。 これらのレコードは、行レベルトリガーまたは複合トリガー(レコードレベルセクションを含む)のみにあります。
トリガー操作 | OLD.column | NEW。コラム |
---|---|---|
挿入 | ヌル | 新しい価値 |
更新する | 古い意味 | 新しい価値 |
削除する | 古い意味 | ヌル |
制限:
- 疑似レコードでは、レコード全体のレベルの操作は禁止されています(:new = null;)
- 古いレコードのフィールドの値を変更することはできません
- 削除時にトリガーが起動した場合、新しいレコードのフィールドの値を変更することはできません
- 後トリガーでは、新しいレコードのフィールドの値を変更できません
dmlトリガーの代わりに
- これらはビュー用に作成され、DML操作を機能に置き換えます。
- 更新可能でないビューの挿入/更新または削除操作を許可します。
代わりにdml_triggerコンストラクト:
- これは常に行レベルのトリガーです。
- 古い擬似エントリと新しい擬似エントリにアクセスできますが、変更することはできません
- dml操作をビューに置き換えます
例
CREATE OR REPLACE VIEW order_info AS SELECT c.customer_id, c.cust_last_name, c.cust_first_name, o.order_id, o.order_date, o.order_status FROM customers c, orders o WHERE c.customer_id = o.customer_id; CREATE OR REPLACE TRIGGER order_info_insert INSTEAD OF INSERT ON order_info DECLARE duplicate_info EXCEPTION; PRAGMA EXCEPTION_INIT (duplicate_info, -00001); BEGIN INSERT INTO customers (customer_id, cust_last_name, cust_first_name) VALUES ( :new.customer_id, :new.cust_last_name, :new.cust_first_name); INSERT INTO orders (order_id, order_date, customer_id) VALUES ( :new.order_id, :new.order_date, :new.customer_id); EXCEPTION WHEN duplicate_info THEN RAISE_APPLICATION_ERROR ( num=> -20107, msg=> 'Duplicate customer or order ID'); END order_info_insert;
ビューのネストされたテーブル列のトリガーの代わり
ネストされたテーブルビューのトリガーを作成できます。 このようなトリガーには、追加の疑似レコードもあります-親は、ビューのレコード全体を参照します(古い疑似レコードと新しい疑似レコードは、ネストされたテーブルのエントリのみを参照します)
そのようなトリガーの例
-- Create type of nested table element: CREATE OR REPLACE TYPE nte AUTHID DEFINER IS OBJECT ( emp_id NUMBER(6), lastname VARCHAR2(25), job VARCHAR2(10), sal NUMBER(8,2) ); / -- Created type of nested table: CREATE OR REPLACE TYPE emp_list_ IS TABLE OF nte; / -- Create view: CREATE OR REPLACE VIEW dept_view AS SELECT d.department_id, d.department_name, CAST (MULTISET (SELECT e.employee_id, e.last_name, e.job_id, e.salary FROM employees e WHERE e.department_id = d.department_id ) AS emp_list_ ) emplist FROM departments d; -- Create trigger: CREATE OR REPLACE TRIGGER dept_emplist_tr INSTEAD OF INSERT ON NESTED TABLE emplist OF dept_view REFERENCING NEW AS Employee PARENT AS Department FOR EACH ROW BEGIN -- Insert on nested table translates to insert on base table: INSERT INTO employees ( employee_id, last_name, email, hire_date, job_id, salary, department_id ) VALUES ( :Employee.emp_id, -- employee_id :Employee.lastname, -- last_name :Employee.lastname || '@company.com', -- email SYSDATE, -- hire_date :Employee.job, -- job_id :Employee.sal, -- salary :Department.department_id -- department_id ); END;
トリガー挿入ステートメントをトリガーする
INSERT INTO TABLE ( SELECT d.emplist FROM dept_view d WHERE department_id = 10 ) VALUES (1001, 'Glenn', 'AC_MGR', 10000);
複合DMLトリガー
バージョン11Gで導入されたこれらのトリガーには、すべてのタイプのDMLトリガーの処理が1つのブロックに含まれています。
Compound_dml_triggerコンストラクト:
ここで、 compound_trigger_block:
タイミングポイントセクション:
タイミングポイント:
tps_body:
- このようなトリガーは、さまざまなイベントおよびさまざまな時点(オペレーターまたは行レベル、イベントの挿入/更新/削除、イベントの前後)で機能します。
- オフライントランザクションにすることはできません。
主に使用されます:
- コレクション内の行を収集して別のテーブルに挿入し、定期的にバンドルに挿入します
- 変更テーブルエラーを回避する
複合トリガー構造
トリガーをトリガーしたステートメントの実行中に存在する変数を含む場合があります。
このようなトリガーには、次のセクションが含まれます。
- 文の前
- ステートメントの後
- 各行の前
- 各行の後
これらのトリガーには初期化セクションはありませんが、これらの目的にはbeforeステートメントセクションを使用できます。
トリガーにbeforeステートメントセクションもafterステートメントセクションもなく、ステートメントがレコードに影響しない場合、そのようなトリガーは機能しません。
制限:
- 式レベルのセクションの古い、新しい、または親の擬似エントリにはアクセスできません(ステートメントの前とステートメントの後)
- 変更できるのは、各行セクションの前にある新しい擬似レコードフィールドの値のみです
- あるセクションで生成された例外は、別のセクションでは処理できません。
- gotoステートメントを使用する場合、同じセクション内のコードを指す必要があります。
例
create or replace trigger tr_table_test_compound for update or delete or insert on table_test compound trigger v_count pls_integer := 0; before statement is begin dbms_output.put_line ( 'before statement' ); end before statement; before each row is begin dbms_output.put_line ( 'before insert' ); end before each row; after each row is begin dbms_output.put_line ( 'after insert' ); v_count := v_count + 1; end after each row; after statement is begin dbms_output.put_line ( 'after statement' ); end after statement; end tr_table_test_compound;
DMLトリガーを定義するための基本的な規則
- 更新-トリガーする変更可能なフィールドのリストを指定できます
- SQL実行段階でトリガーを開始せずに、ヘッダーとWhen ...のすべての条件がチェックされます。
- オペレーターが組み込み関数のみを使用できる場合
- 同じ種類の複数のトリガーを作成できます。実行順序はデフォルトでは定義されていませんが、FOLLOWS TRIGGER_FIRST構文を使用して設定できます
- 一意性制約は、レコードが変更されたとき、つまり実行前トリガーの実行後にチェックされます
- 変数宣言セクションは、単語DECLAREによって定義されます
- トリガーのメインブロックは、通常のPL / SQLブロックと同じルールに従います
DMLトリガーの制限
- DDLステートメントを実行できません(スタンドアロントランザクションのみ)
- トランザクション制御ステートメントでルーチンを実行できません
- SERIALLY_REUSABLEパッケージへのアクセス権がありません
- サイズは32Kを超えることはできません
- タイプLONGおよびLONG RAWの変数は宣言できません
突然変異エラー表ORA-04091
行レベルのトリガーでターゲット表のデータを取得または変更しようとすると、Oracleはそれを許可せず、エラーORA-04091をスローします。
この問題を回避するには、次の手法を使用します。
- 操作レベルトリガーを使用する
- トリガーのオフライントランザクション
- サードパーティの構造(パッケージレベルのコレクション)を使用する
- 化合物トリガーを使用する
- トリガーから機能を削除してアルゴリズム自体を変更する
システムトリガー
System_triggerコンストラクト:
このようなトリガーは、スキーマまたはデータベース全体のいずれかに適用されます。
システムトリガーが起動する時点にはいくつかのオプションがあります。
- 操作が実行される前(トリガーが起動する場所)
- 操作が完了した後(トリガーが起動する)
- Createステートメントを実行する代わりに
スキーマトリガー
- 回路のユーザー所有者がイベントを起動する(操作を実行する)ときに常に動作し、そのイベントでトリガーが起動されます。
- 他のユーザーが作成者の権限で呼び出されるプロシージャ/関数を起動し、このプロシージャ/関数でシステムトリガーが作成された操作が実行される場合、このトリガーは機能します。
トリガーの例
CREATE OR REPLACE TRIGGER drop_trigger BEFORE DROP ON hr.SCHEMA BEGIN RAISE_APPLICATION_ERROR ( num => -20000, msg => 'Cannot drop object'); END;
データベーストリガー
- このようなトリガーは、データベースユーザーがトリガーを作成したコマンドを実行するとトリガーされます。
トリガーの例
CREATE OR REPLACE TRIGGER check_user AFTER LOGON ON DATABASE BEGIN check_user; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR (-20000, 'Unexpected error: '|| DBMS_Utility.Format_Error_Stack); END;
トリガーを作成する代わりに
- これは、作成コマンドで起動し、このコマンドを置き換える回路図レベルのトリガーです(つまり、作成コマンドを実行する代わりに、トリガーの本体が実行されます)。
トリガーの例
CREATE OR REPLACE TRIGGER t INSTEAD OF CREATE ON SCHEMA BEGIN EXECUTE IMMEDIATE 'CREATE TABLE T (n NUMBER, m NUMBER)'; END;
システムトリガー属性
属性 | 戻り値とタイプ |
---|---|
ora_client_ip_address | Varchar2
クライアントIPアドレス 例: |
ora_database_name | Varchar2(50)
データベース名 例:
|
ora_des_encrypted_password | Varchar2
作成または変更されたDES暗号化ユーザーパスワード 例: |
ora_dict_obj_name | Varchar2(30)
DDL操作が実行されるオブジェクトの名前 例: |
ora_dict_obj_name_list(
name_list OUT ora_name_list_t ) | Pls_integer
コマンドによって変更されたオブジェクトの数 Name_list-コマンドによって変更されたオブジェクトのリスト 例: |
ora_dict_obj_owner | Varchar2(30)
DDL操作の所有者 例: |
ora_dict_obj_owner_list(
owner_list OUT ora_name_list_t ) | Pls_integer
チームによって変更されたオブジェクトの所有者の数 Owner_list-コマンドによって変更されたオブジェクトの所有者のリスト 例: |
ora_dict_obj_type | Varchar2(20)
ddl操作が実行されるオブジェクトのタイプ 例: |
ora_grantee(
user_list OUT ora_name_list_t ) | Pls_integer
付与操作に参加しているユーザーの数 User_list-これらのユーザーのリスト 例: |
ora_instance_num | 数
インスタンス番号 例: |
ora_is_alter_column(
column_name IN VARCHAR2 ) | ブール値
指定されたフィールドが変更操作によって変更された場合はtrue。 そうでなければ偽 例: |
ora_is_creating_nested_table | ブール値
現在のイベントがネストされたテーブルの作成である場合はtrue。 そうでなければ偽 例: |
ora_is_drop_column(
column_name IN VARCHAR2 ) | ブール値
指定されたフィールドが削除された場合はtrue。 そうでなければ偽 例: |
ora_is_servererror(
error_number IN VARCHAR2 ) | ブール値
error_number番号で例外がスローされた場合はtrue。 そうでなければ偽 例: |
ora_login_user | Varchar2(30)
現在のユーザー名 例: |
ora_partition_pos | Pls_integer
テーブルを作成するためのトリガーの代わりに、パーティション構造を挿入できるコマンドのSQLテキスト内の位置 例: |
ora_privilege_list(
privilege_list OUT ora_name_list_t ) | Pls_integer
付与または取り消し操作に関係する特権の数 Privilege_list-これらの特権のリスト 例: |
ora_revokee(
user_list OUT ora_name_list_t ) | Pls_integer
取り消し操作に参加しているユーザーの数 User_list-これらのユーザーのリスト 例: |
ora_server_error(
PLS_INTEGERの位置 ) | 数
指定された位置のエラースタックのエラーコード。1はスタックの先頭 例: |
ora_server_error_depth | Pls_integer
エラースタック内のエラーメッセージの数 例: |
ora_server_error_msg(
PLS_INTEGERの位置 ) | Varchar2
指定された場所のエラースタックのエラーメッセージ 例: |
ora_server_error_num_params(
PLS_INTEGERの位置 ) | Pls_integer
指定されたエラースタック位置で置き換えられた行の数(%s形式を使用) 例:
|
ora_server_error_param(
PLS_INTEGERの位置、 param IN PLS_INTEGER ) | Varchar2
指定された位置のエラースタックにあるエラーメッセージの置換テキスト(アカウント置換テキストで返されるパラメーター) 例: |
ora_sql_txt(
sql_text OUT ora_name_list_t ) | Pls_integer
pl / sql sql_textコレクション内の要素の数。 sql_textパラメーター自体は、トリガーが機能したコマンドのテキストを返します 例: |
ora_sysevent | Varchar2(20)
トリガーが発動するチームの名前 例: |
ora_with_grant_option | ブール値
付与オプションで特権が付与されている場合はtrue。 そうでない場合はfalse。 例: |
ora_space_error_info(
error_number OUT NUMBER、 error_type OUT VARCHAR2、 object_owner OUT VARCHAR2 table_space_name OUT VARCHAR2 object_name OUT VARCHAR2、 sub_object_name OUT VARCHAR2 ) | ブール値
スペース不足が原因でエラーが発生した場合はtrue。 出力パラメーターでは、オブジェクトに関する情報。 例: |
システムトリガーイベント
イベント | 説明 | 利用可能な属性 |
---|---|---|
起動後 | データベースを起動するとき。 DBレベルでのみ発生します。 エラーが発生すると、システムログに書き込みます。 | ora_sysevent
ora_login_user ora_instance_num ora_database_name |
シャットダウンする前に | サーバーがシャットダウンプロセスを開始する前。 DBレベルでのみ発生します。 エラー時には、システムログに書き込みます。 | ora_sysevent
ora_login_user ora_instance_num ora_database_name |
DB_ROLE_CHANGEの後 | ロールをスタンバイからプライマリに、またはプライマリからスタンバイに変更した後に初めてデータベースを起動するとき。
Data Guard構成でのみ使用され、DBレベルでのみ発生します | ora_sysevent
ora_login_user ora_instance_num ora_database_name |
サーバーエラー後 | エラーが発生した場合(条件がある場合、条件で指定されたエラーでのみ機能します)。 トリガーの本体でエラーが発生すると、それ自体を再帰的に呼び出しません。 | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_server_error ora_is_servererror ora_space_error_info |
変更前
変更後 | alterコマンドでオブジェクトが変更された場合 | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_type ora_dict_obj_name ora_dict_obj_owner ora_des_encrypted_password (ALTER USERイベントの場合) ora_is_alter_column (ALTER TABLEイベントの場合) ora_is_drop_column (ALTER TABLEイベントの場合) |
ドロップする前に
ドロップ後 | オブジェクトを削除するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_type ora_dict_obj_name ora_dict_obj_owner |
分析する前に
分析後 | 分析コマンドがトリガーされたとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner |
関連統計の前に
アソシエイト統計後 | 関連統計コマンドを実行するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner ora_dict_obj_name_list ora_dict_obj_owner_list |
審査前
監査後 NOAUDITの前に ノーディット後 | auditまたはnoauditを実行する場合 | ora_sysevent
ora_login_user ora_instance_num ora_database_name |
コメントする前に
コメント後 | オブジェクトにコメントを追加するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner |
作成前
作成後 | オブジェクトを作成するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_type ora_dict_obj_name ora_dict_obj_owner ora_is_creating_nested_table (CREATE TABLEイベントの場合) |
DDLの前に
DDL後 | データベースの変更、制御ファイルの作成、データベースの作成を除く、ほとんどのDDLコマンドで機能します。 | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner |
統計を分離する前に
統計分離後 | disassociate statisticsコマンドを実行するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner ora_dict_obj_name_list ora_dict_obj_owner_list |
付与前
付与後 | grantコマンドを発行するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner ora_grantee ora_with_grant_option ora_privilege_list |
ログオフ前 | ユーザーが切断する前に機能し、回線レベルまたはデータベースで発生します | ora_sysevent
ora_login_user ora_instance_num ora_database_name |
ログオン後 | ユーザーがデータベースへの接続を正常に確立した後に機能します。 エラーが発生すると、ユーザーはエントリを拒否されます。 SYSには無効です。 | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_client_ip_address |
名前変更前
名前変更後 | renameコマンドを実行するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_owner ora_dict_obj_type |
取り消す前に
取り消し後 | 取り消しコマンドを実行するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner ora_revokee ora_privilege_list |
中断後 | サーバーエラー(メモリ不足)が原因でsqlコマンドが中断された場合に機能します。
この場合、トリガーは条件を変更してコマンドの実行を再開する必要があります) | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_server_error ora_is_servererror ora_space_error_info |
切り捨てる前に
切り捨て後 | truncateコマンドを実行するとき | ora_sysevent
ora_login_user ora_instance_num ora_database_name ora_dict_obj_name ora_dict_obj_type ora_dict_obj_owner |
トリガーのコンパイル
トリガーの作成コマンド中にエラーが発生した場合、トリガーは作成されますが、無効な状態になります。 この場合、そのようなトリガーがハングしているオブジェクトに対して操作(トリガーをトリガーする必要がある操作)を実行しようとすると、すべて失敗します。 これは次の場合には適用されません。
- トリガーは無効な状態で作成されます(またはそのような状態になります)
- データベーストリガーイベントでの起動後
- トリガーイベントは、データベースへのログオン後またはスキーマへのログオン後であり、システムユーザーとしてログインが試行されます。
トリガーを再コンパイルするには、alter triggerコマンドを使用します。
トリガー例外
トリガーで例外が発生した場合、操作全体がロールバックされます(トリガー内で行われた変更を含む)。 これの例外:
- トリガーイベントがデータベースの起動後またはデータベースのシャットダウン前の場合
- トリガーイベントがデータベースへのログオン後であり、ユーザーがデータベーストリガー管理権限を持っている場合
- スキーマへのログオン後のトリガーイベントで、ユーザーがスキーマを所有しているか、または任意のトリガーを変更する特権を持っている場合
トリガー順序
Trigger_ordering_clauseコンストラクト:
- まず、すべての前のステートメントトリガー
- 次に、トリガーの各行の前のすべて
- 結局、各行トリガーの後
- そして最後に、トリガーステートメントの後のすべて
同時に起動するトリガーの実行順序を明示的に指定するには(この順序はデフォルトでは定義されていないため)、次を使用し、構造を先行させます。
トリガーの有効化/無効化
これは、たとえば、大量の情報をテーブルに読み込むために必要になる場合があります。
次のコマンドを使用して、トリガーを有効/無効にできます。
ALTER TRIGGER [schema.]trigger_name { ENABLE | DISABLE };
テーブルのすべてのトリガーを一度に有効/無効にするには:
ALTER TABLE table_name { ENABLE | DISABLE } ALL TRIGGERS;
トリガーを変更するには、トリガーの作成または置換コマンドを使用するか、最初にドロップトリガーを削除してからトリガーを再作成します。
トリガーの変更操作では、トリガーの有効化/無効化、コンパイル、または名前の変更のみが可能です。
トリガーのコンパイル:
alter trigger TRIGGER_NAME compile;
トリガー操作の権利
トリガーを使用するには、スキーム内であっても、トリガーの作成権限が必要です。これにより、作成、変更、削除の権限が付与されます。
grant create trigger to USER;
他のすべてのスキームでトリガーを操作するには、* anyトリガー権限が必要です。 作成、変更、削除の権利は個別に付与されることに注意してください。
grant create any trigger to USER; grant alter any trigger to USER; grant drop any trigger to USER;
DATABASEレベルでシステムトリガーを操作するには、ADMINISTER DATABASE TRIGGER権限が必要です。
grant ADMINISTER DATABASE TRIGGER to USER;
トリガー情報を含むデータの辞書:
- dba_triggers-トリガー情報
- dba_source-トリガー本体コード
- dba_objects-トリガーの有効性
この記事の執筆に基づいた講義のビデオ録画:
オラクルのトピックに関する他の多くのビデオは、このチャンネルで見つけることができます: www.youtube.com/c/MoscowDevelopmentTeam
その他のOracleの記事
Oracleのコレクションについて