触发器六(系统触发器)(学习笔记)

系统触发器

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

 

CREATE [OR REPLACE] TRIGGER 触发器名称

    [BEFORE | AFTER] [数据库事件] ON [DATABASE | SCHEMA]

    [WHEN 触发条件]

    [DECLARE]

        [程序声明部分 ;]

    BEGIN

        程序代码部分 ;

    END [触发器名称] ;

 

使用管理员才可以创建系统触发器

系统触发器事件

NO. 事件 触发时机 描述
1 STARTUP AFTER 数据库实例启动之后触发
2 SHUTDOWN BEFORE 数据库实例关闭之前触发
3 SERVERERROR AFTER 出错误时触发
4 LOGON AFTER 用户登录后触发
5 LOGOFF BEFOR 用户注销前触发

示例一、登录登出日志功能

--创建序列

CREATE SEQUENCE user_log_seq;

--创建日志表

CREATE TABLE user_log(

             logid          NUMBER CONSTRAINT  pk_logoid PRIMARY KEY,

             username       VARCHAR2(50)           NOT NULL,

             logodate       DATE,

             logoffdate     DATE,

             ip             VARCHAR2(20),

             logtype        VARCHAR2(20)

);
--创建登录触发器

create or replace trigger logon_trigger

  AFTER LOGON ON DATABASE

  

declare

 

begin

   INSERT INTO user_log(logid,username,logodate,ip,logtype)

  VALUES(user_log_seq.nextval,ora_login_user,SYSDATE,ora_client_ip_address,'LOGON');

end logon_trigger;
--创建登出触发器

CREATE OR REPLACE TRIGGER LOGON_TRIGGER

  BEFORE LOGOFF ON DATABASE



DECLARE



BEGIN

  INSERT INTO USER_LOG

    (LOGID, USERNAME, LOGOFFDATE, IP, LOGTYPE)

  VALUES

    (USER_LOG_SEQ.NEXTVAL,

     ORA_LOGIN_USER,

     SYSDATE,

     ORA_CLIENT_IP_ADDRESS,

     'LOGFF');

END LOGON_TRIGGER;

切换用户进行登录

使用管理登录,查看user_log表

SELECT * FROM user_log;

示例二、 系统启动和关闭时,日志记录功能

 

--创建索引

CREATE SEQUENCE db_event_log_seq;

--查询索引

SELECT * FROM user_sequences WHERE sequence_name='DB_EVENT_LOG_SEQ';

--创建数据库记录事件表

CREATE TABLE db_event_log(

             eventid          NUMBER    CONSTRAINT pk_eventid PRIMARY KEY,

             enentType        VARCHAR2(50)        NOT NULL,

             enentDate        DATE                 NOT NULL,

             eventUser        VARCHAR2(50)         NOT NULL

);

--查询表

SELECT * FROM db_event_log;
--创建启动之后触发器

create or replace trigger startup_trigger

  after startup ON DATABASE    



declare

 

BEGIN

   INSERT INTO db_event_log(eventid,enenttype,enentdate,eventuser)

   VALUES(db_event_log_seq.nextval,'STARTUP',SYSDATE,ora_login_user);

   COMMIT;

end startup_trigger;



--创建关闭之前触发器

create or replace trigger shutdown_trigger

  before shutdown  ON DATABASE   



declare

  

begin

   INSERT INTO db_event_log(eventid,enenttype,enentdate,eventuser)

   VALUES(db_event_log_seq.nextval,'SHUTDOWN',SYSDATE,ora_login_user);

   COMMIT;

end shutdown_trigger;
-测试在sqlplus中执行

SHUTDOWN ABORT; --立刻关闭

startup          --启动

SELECT * FROM db_event_log;

示例三、 错误信息日志

--创建索引

CREATE SEQUENCE db_error_seq;

--查询索引

SELECT * FROM user_sequences WHERE sequence_name='DB_ERROR_SEQ';

---创建一张记录错误信息的数据表

CREATE TABLE db_error(

             eid             NUMBER  CONSTRAINT pk_eid PRIMARY KEY,

             username        VARCHAR2(50),

             errorDate       DATE,

             dbname          VARCHAR2(50),

             CONTENT         CLOB

);

--查询表

SELECT * FROM db_error;
--创建数据库错误触发器

create or replace trigger error_trigger

  after servererror ON DATABASE   



declare

  

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);

     --ora_login_user     用户名

     --ora_database_name  数据库名

     --dbms_utility包

     --dbms_utility.format_error_stack错误内容

end error_trigger;
--测试

--使用普通用户

SELECT * FROM orcl;

INSERT INTO dept(deptno,dname,loc)

VALUES(10,'111','SZ');

--查询表

SELECT * FROM db_error;

 

 

 

 

 

 

你可能感兴趣的:(系统触发器)