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。

posted @ 2013-04-08 12:57  AlbertCQY  阅读(712)  评论(0编辑  收藏  举报