建立資料庫事件觸發程序文法
1 CREATE [OR REPLACE] TRIGGER trigger_name
2 {BEFORE | AFTER} {database_event} ON {DATABASE | SCHEMA}
3 DECLARE
4 Variable declarations
5 BEGIN
6 ...some code...
7 END;
資料庫事件觸發程序是發生在資料庫範圍的事件時觸發的。有6個資料庫事件觸發程序。STARTUP
資料庫開啟時觸發的。
沒有before startup觸發器。
Example:
CREATE OR REPLACE TRIGGER startup_pinner
AFTER STARTUP ON DATABASE
BEGIN
pin_plsql_packages;
pin_application_packages;
END;
SHUTDOWN
資料庫正常關閉時觸發的。
沒有after shutdown 觸發器。
Example:
CREATE OR REPLACE TRIGGER before_shutdown
BEFORE SHUTDOWN ON DATABASE
BEGIN
gather_system_stats;
END;
注意:只有在正常關閉情況下,shutdown nomal或者shutdown immediate時觸發,非正常關閉shutdown abort不能觸發。
SERVERERROR
當資料庫發生錯誤時觸發。
沒有before servererror觸發器。
Example:
DROP TRIGGER error_logger;
DROP TABLE error_log;
CREATE SEQUENCE error_seq;
CREATE TABLE error_log
(error_id NUMBER,
username VARCHAR2(30),
error_number NUMBER,
sequence NUMBER,
timestamp DATE);
CREATE OR REPLACE TRIGGER error_logger
AFTER SERVERERROR
ON SCHEMA
DECLARE
v_errnum NUMBER; -- the Oracle error #
v_now DATE := SYSDATE; -- current time
BEGIN
-- for every error in the error stack...
FOR e_counter IN 1..ORA_SERVER_ERROR_DEPTH LOOP
-- write the error out to the log table; no
-- commit is required because we are in an
-- autonomous transaction
INSERT INTO error_log(error_id,
username,
error_number,
sequence,
timestamp)
VALUES(error_seq.nextval,
USER,
ORA_SERVER_ERROR(e_counter),
e_counter,
v_now);
END LOOP; -- every error on the stack
END;
/
LOGON
當開始一個資料庫會話時觸發。
沒有before logon觸發器。
Example:
CREATE OR REPLACE TRIGGER after_logon
AFTER LOGON ON SCHEMA
DECLARE
v_sql VARCHAR2(100) := 'ALTER SESSION ENABLE RESUMABLE ' ||
'TIMEOUT 10 NAME ' || '''' ||
'OLAP Session' || '''';
BEGIN
EXECUTE IMMEDIATE v_sql;
DBMS_SESSION.SET_CONTEXT('OLAP Namespace',
'Customer ID',
load_user_customer_id);
END;
LOGOFF
當一個資料庫會話正常終止時觸發。
沒有after logoff觸發器。
Example:
CREATE OR REPLACE TRIGGER before_logoff
BEFORE LOGOFF ON DATABASE
BEGIN
gather_session_stats;
END;
DB_ROLE_CHANGE
當一個備用資料庫切換成主要資料庫時或者反過來,觸發。
多用於dataguard。