zoukankan      html  css  js  c++  java
  • 触发器六(系统触发器)(学习笔记)

    系统触发器

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

     

    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;

     

  • 相关阅读:
    .NET Core中的鉴权授权正确方式(.NET5)
    关于调试程序容易忽略的问题
    Activity组件的启动过程
    Service组件应用实例
    Navicat_Premium 支持mac m1芯片
    15种sql优化
    sql语句中with用法
    用传对象方式修改sql
    如何将java project转换成maven项目
    SQLSERVER 快速替换引号字段
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4220194.html
Copyright © 2011-2022 走看看