Oracle触发器4-数据库事件触发器
创建数据库事件触发器语法
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。