系统触发器
系统触发器用于监视数据库服务的打开、关闭、错误等信息的取得,或者是监控用户的行为操作等。如果要创建系统触发器,可以使用如下的语法
CREATE [OR REPLACE] TRIGGER 触发器名称
[BEFORE | AFTER] [数据库事件] ON [DATABASE | SCHEMA]
[WHEN 触发条件]
[DECLARE]
[程序声明部分;]
BEGIN
程序代码部分;
END [触发器名称];
/
系统触发器事件
事件 | 触发时机 | 描述 |
---|---|---|
STARTUP | AFTER | 数据库实例启动之后触发 |
SHUTDOWN | BEFORE | 数据库实例关闭之前触发 |
SERVERERROR | AFTER | 出现错误时触发 |
LOGON | AFTER | 用户登录后触发 |
LOGOFF | BEFORE | 用户注销前触发 |
范例
范例 1:登录日志
--登入日志表创建
drop sequence user_log_seq;
drop table user_log PURGE;
CREATE SEQUENCE user_log_seq;
create table user_log(
loginid NUMBER CONSTRAINT pk_loginid PRIMARY KEY,
username VARCHAR2(50) NOT NULL,
logondate DATE,
logoffdate DATE,
ip VARCHAR2(20),
logtype VARCHAR2(20)
);
--编写用户登录触发器
create or replace trigger logon_trigger
after logon
on database
begin
insert into user_log(loginid,username,logondate,ip,logtype)
values(user_log_seq.nextval,ora_login_user,SYSDATE,ora_client_ip_address,'LOGON');
end;
/
--编写用户注销触发器
create or replace trigger logoff_trigger
before logoff
on database
begin
insert into user_log(loginid,username,logondate,ip,logtype)
values(user_log_seq.nextval,ora_login_user,SYSDATE,ora_client_ip_address,'LOGOFF');
end;
/
范例 2:定义数据库事件的记录表
--创建记录事件的表
drop table db_event_log purge;
drop sequence db_event_log_seq;
create sequence db_event_log_seq;
create table db_event_log(
eventId NUMBER CONSTRAINT pk_eventid PRIMARY KEY,
eventType VARCHAR2(50) NOT NULL,
eventDate DATE NOT NULL,
eventUser VARCHAR2(50) NOT NULL
);
--创建数据库启动触发器
CREATE OR REPLACE NONEDITIONABLE TRIGGER shutdown_trigger
BEFORE SHUTDOWN
ON DATABASE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO db_event_log(eventId,Eventtype,eventdate,eventuser)
VALUES(db_event_log_seq.nextval,'SHUTDOWN',SYSDATE,ora_login_user);
END;
--创建数据库关闭触发器
CREATE OR REPLACE TRIGGER shutdown_trigger
BEFORE SHUTDOWN
ON DATABASE
BEGIN
INSERT INTO db_event_log(eventId,Eventtype,eventdate,eventuser)
VALUES(db_event_log_seq.nextval,'SHUTDOWN',SYSDATE,ora_login_user);
END;
/
范例 3:错误信息记录
--创建错误信息表
DROP SEQUENCE db_error_seq;
DROP TABLE db_error PURGE;
CREATE SEQUENCE db_error_seq;
CREATE TABLE db_error(
eid NUMBER CONSTRAINT pk_eid PRIMARY KEY,
username VARCHAR2(50),
errorDate DATE,
dbname VARCHAR2(50),
content CLOB
);
--触发器创建
CREATE OR REPLACE TRIGGER error_trigger
AFTER SERVERERROR ON DATABASE
BEGIN
INSERT INTO db_error(eid,username,errorDate,dbname,content)
VALUES(db_error_seq.nextval,ORA_LOGIN_USER,SYSDATE,ORA_DATABASE_NAME,DBMS_UTILITY.FORMAT_ERROR_STACK);
END;
/