Oracle-Trigger-System-1

系统触发器

系统触发器用于监视数据库服务的打开、关闭、错误等信息的取得,或者是监控用户的行为操作等。如果要创建系统触发器,可以使用如下的语法

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;
/
Contents
  1. 1. 系统触发器
    1. 1.1. 系统触发器事件
    2. 1.2. 范例
|