失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Oracle触发器4-数据库事件触发器

Oracle触发器4-数据库事件触发器

时间:2020-11-24 06:11:30

相关推荐

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。

如果觉得《Oracle触发器4-数据库事件触发器》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。