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

时间:2021-01-07 05:10:20

系统触发器

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

 

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;