Oracleのトリガヌに぀いお

䌝統的に、蚘事は論文で曞かれおいたす。 より詳现なコンテンツは、蚘事の最埌に添付されおいるビデオに蚘茉されおおり、Oracleトリガヌに぀いおの講矩蚘録が付いおいたす。


トリガヌの抂芁


トリガヌは、デヌタベヌスに保存される名前付きのpl / sqlブロックです。


トリガヌ分類


トリガヌを䜿甚する理由




plsql_trigger_sourceはそのような構成䜓です。


構文simple_dml_trigger、instead_of_dml_trigger、compound_dml_trigger 、 system_triggerは、蚘事の察応するセクションに蚘茉されおいたす。

DMLトリガヌ




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.columnNEW。コラム
挿入ヌル新しい䟡倀
曎新する叀い意味新しい䟡倀
削陀する叀い意味ヌル


制限


dmlトリガヌの代わりに




代わりにdml_triggerコンストラクト




䟋
 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ステヌトメントセクションもなく、ステヌトメントがレコヌドに圱響しない堎合、そのようなトリガヌは機胜したせん。

制限


䟋
 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トリガヌを定矩するための基本的な芏則




DMLトリガヌの制限




突然倉異゚ラヌ衚ORA-04091



行レベルのトリガヌでタヌゲット衚のデヌタを取埗たたは倉曎しようずするず、Oracleはそれを蚱可せず、゚ラヌORA-04091をスロヌしたす。
この問題を回避するには、次の手法を䜿甚したす。


システムトリガヌ


System_triggerコンストラクト

このようなトリガヌは、スキヌマたたはデヌタベヌス党䜓のいずれかに適甚されたす。

システムトリガヌが起動する時点にはいく぀かのオプションがありたす。


スキヌマトリガヌ




トリガヌの䟋
 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_addressVarchar2
クラむアントIPアドレス
䟋
 IF (ora_sysevent = 'LOGON') THEN v_addr := ora_client_ip_address; END IF; 
ora_database_nameVarchar250
デヌタベヌス名
䟋
 v_db_name := ora_database_name; 
ora_des_encrypted_pa​​sswordVarchar2
䜜成たたは倉曎されたDES暗号化ナヌザヌパスワヌド
䟋
 IF (ora_dict_obj_type = 'USER') THEN INSERT INTO event_table VALUES (ora_des_encrypted_password); END IF; 
ora_dict_obj_nameVarchar230
DDL操䜜が実行されるオブゞェクトの名前

䟋
 INSERT INTO event_table VALUES ('Changed object is ' || ora_dict_obj_name); 
ora_dict_obj_name_list
name_list OUT ora_name_list_t

Pls_integer
コマンドによっお倉曎されたオブゞェクトの数
Name_list-コマンドによっお倉曎されたオブゞェクトのリスト

䟋
 IF (ora_sysevent='ASSOCIATE STATISTICS') THEN number_modified := ora_dict_obj_name_list(name_list); END IF; 
ora_dict_obj_ownerVarchar230
DDL操䜜の所有者

䟋
 INSERT INTO event_table VALUES ('object owner is' || ora_dict_obj_owner); 
ora_dict_obj_owner_list
owner_list OUT ora_name_list_t

Pls_integer
チヌムによっお倉曎されたオブゞェクトの所有者の数
Owner_list-コマンドによっお倉曎されたオブゞェクトの所有者のリスト

䟋
 IF (ora_sysevent='ASSOCIATE STATISTICS') THEN number_modified := ora_dict_obj_name_list(owner_list); END IF; 
ora_dict_obj_typeVarchar220
ddl操䜜が実行されるオブゞェクトのタむプ

䟋
 INSERT INTO event_table VALUES ('This object is a ' || ora_dict_obj_type); 
ora_grantee
user_list OUT ora_name_list_t

Pls_integer
付䞎操䜜に参加しおいるナヌザヌの数
User_list-これらのナヌザヌのリスト

䟋
 IF (ora_sysevent = 'GRANT') THEN number_of_grantees := ora_grantee(user_list); END IF; 
ora_instance_num数
むンスタンス番号

䟋
 IF (ora_instance_num = 1) THEN INSERT INTO event_table VALUES ('1'); END IF; 
ora_is_alter_column
column_name IN VARCHAR2

ブヌル倀
指定されたフィヌルドが倉曎操䜜によっお倉曎された堎合はtrue。 そうでなければ停

䟋
 IF (ora_sysevent = 'ALTER' AND ora_dict_obj_type = 'TABLE') THEN alter_column := ora_is_alter_column('C'); END IF; 
ora_is_creating_nested_tableブヌル倀
珟圚のむベントがネストされたテヌブルの䜜成である堎合はtrue。 そうでなければ停

䟋
 IF (ora_sysevent = 'CREATE' AND ora_dict_obj_type = 'TABLE' AND ora_is_creating_nested_table) THEN INSERT INTO event_table VALUES ('A nested table is created'); END IF; 
ora_is_drop_column
column_name IN VARCHAR2

ブヌル倀
指定されたフィヌルドが削陀された堎合はtrue。 そうでなければ停

䟋
 IF (ora_sysevent = 'ALTER' AND ora_dict_obj_type = 'TABLE') THEN drop_column := ora_is_drop_column('C'); END IF; 
ora_is_servererror
error_number IN VARCHAR2

ブヌル倀
error_number番号で䟋倖がスロヌされた堎合はtrue。 そうでなければ停

䟋
 IF ora_is_servererror(error_number) THEN INSERT INTO event_table VALUES ('Server error!!'); END IF; 
ora_login_userVarchar230
珟圚のナヌザヌ名

䟋
 SELECT ora_login_user FROM DUAL; 
ora_partition_posPls_integer
テヌブルを䜜成するためのトリガヌの代わりに、パヌティション構造を挿入できるコマンドのSQLテキスト内の䜍眮

䟋
 -- Retrieve ora_sql_txt into sql_text variable v_n := ora_partition_pos; v_new_stmt := SUBSTR(sql_text,1,v_n - 1) || ' ' || my_partition_clause || ' ' || SUBSTR(sql_text, v_n)); 
ora_privilege_list
privilege_list OUT ora_name_list_t

Pls_integer
付䞎たたは取り消し操䜜に関係する特暩の数
Privilege_list-これらの特暩のリスト

䟋
 IF (ora_sysevent = 'GRANT' OR ora_sysevent = 'REVOKE') THEN number_of_privileges := ora_privilege_list(privilege_list); END IF; 
ora_revokee
user_list OUT ora_name_list_t

Pls_integer
取り消し操䜜に参加しおいるナヌザヌの数
User_list-これらのナヌザヌのリスト

䟋
 IF (ora_sysevent = 'REVOKE') THEN number_of_users := ora_revokee(user_list); END IF; 
ora_server_error
PLS_INTEGERの䜍眮

数
指定された䜍眮の゚ラヌスタックの゚ラヌコヌド。1はスタックの先頭

䟋
 INSERT INTO event_table VALUES ('top stack error ' || ora_server_error(1)); 
ora_server_error_depthPls_integer
゚ラヌスタック内の゚ラヌメッセヌゞの数

䟋
 n := ora_server_error_depth; -- Use n with functions such as ora_server_error 
ora_server_error_msg
PLS_INTEGERの䜍眮

Varchar2
指定された堎所の゚ラヌスタックの゚ラヌメッセヌゞ

䟋
 INSERT INTO event_table VALUES ('top stack error message' || ora_server_error_msg(1)); 
ora_server_error_num_params
PLS_INTEGERの䜍眮

Pls_integer
指定された゚ラヌスタック䜍眮で眮き換えられた行の数s圢匏を䜿甚

䟋
 n := ora_server_error_num_params(1); 
ora_server_error_param
PLS_INTEGERの䜍眮、
param IN PLS_INTEGER

Varchar2
指定された䜍眮の゚ラヌスタックにある゚ラヌメッセヌゞの眮換テキストアカりント眮換テキストで返されるパラメヌタヌ

䟋
 -- Second %s in "Expected %s, found %s": param := ora_server_error_param(1,2); 
ora_sql_txt
sql_text OUT ora_name_list_t

Pls_integer
pl / sql sql_textコレクション内の芁玠の数。
sql_textパラメヌタヌ自䜓は、トリガヌが機胜したコマンドのテキストを返したす

䟋
 CREATE TABLE event_table (col VARCHAR2(2030)); DECLARE sql_text ora_name_list_t; n PLS_INTEGER; v_stmt VARCHAR2(2000); BEGIN n := ora_sql_txt(sql_text); FOR i IN 1..n LOOP v_stmt := v_stmt || sql_text(i); END LOOP; INSERT INTO event_table VALUES ('text of triggering statement: ' || v_stmt); END; 
ora_syseventVarchar220
トリガヌが発動するチヌムの名前

䟋
 INSERT INTO event_table VALUES (ora_sysevent); 
ora_with_grant_optionブヌル倀
付䞎オプションで特暩が付䞎されおいる堎合はtrue。 そうでない堎合はfalse。

䟋
 IF (ora_sysevent = 'GRANT' AND ora_with_grant_option = TRUE) THEN INSERT INTO event_table VALUES ('with grant option'); END IF; 
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。 出力パラメヌタヌでは、オブゞェクトに関する情報。

䟋
 IF (ora_space_error_info ( eno,typ,owner,ts,obj,subobj) = TRUE) THEN DBMS_OUTPUT.PUT_LINE('The object '|| obj || ' owned by ' || owner || ' has run out of space.'); END IF; 


システムトリガヌむベント


むベント説明利甚可胜な属性
起動埌デヌタベヌスを起動するずき。 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_pa​​ssword
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コンストラクト


  1. たず、すべおの前のステヌトメントトリガヌ
  2. 次に、トリガヌの各行の前のすべお
  3. 結局、各行トリガヌの埌
  4. そしお最埌に、トリガヌステヌトメントの埌のすべお

同時に起動するトリガヌの実行順序を明瀺的に指定するにはこの順序はデフォルトでは定矩されおいないため、次を䜿甚し、構造を先行させたす。

トリガヌの有効化/無効化


これは、たずえば、倧量の情報をテヌブルに読み蟌むために必芁になる堎合がありたす。
次のコマンドを䜿甚しお、トリガヌを有効/無効にできたす。
 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; 


トリガヌ情報を含むデヌタの蟞曞




この蚘事の執筆に基づいた講矩のビデオ録画



オラクルのトピックに関する他の倚くのビデオは、このチャンネルで芋぀けるこずができたす www.youtube.com/c/MoscowDevelopmentTeam

その他のOracleの蚘事


Oracleのコレクションに぀いお

Source: https://habr.com/ru/post/J256655/


All Articles