oracle数据库登录、DDL触发器的应用

from http://blog.sina.com.cn/s/blog_69c01c32010175kq.html

登录触发器
oracle登录记录触发器:
1.创建日志记录表:
CREATE TABLE SYSTEM.LOGIN_LOG
(
    SESSION_ID                     NUMBER,
    LOGIN_ON_TIME                  DATE,
    LOGIN_OFF_TIME                 DATE,
    USER_IN_DB                     VARCHAR2(30),
    PROCESS      VARCHAR2(12),
    TYPE      VARCHAR2(10),
    MACHINE                        VARCHAR2(64),
    OSUSER      VARCHAR2(30),
    IP_ADDRESS                     VARCHAR2(20),
    RUN_PROGRAM                    VARCHAR2(48)
) tablespace TS_AUDIT_MON;
create index SYSTEM.IDX_LOGIN_LOG1 on SYSTEM.LOGIN_LOG (LOGIN_ON_TIME desc,SESSION_ID) tablespace TS_AUDIT_MON;
create index SYSTEM.IDX_LOGIN_LOG2 on SYSTEM.LOGIN_LOG (USER_IN_DB,SESSION_ID) tablespace TS_AUDIT_MON;


2.创建登录触发器:
CREATE OR REPLACE TRIGGER sys.login_on_info
  AFTER logon ON DATABASE
BEGIN
  INSERT INTO system.login_log
    (session_id,
     login_on_time,
     login_off_time,
     user_in_db,
     process,
     TYPE,
     machine,
     osuser,
     ip_address,
     run_program)
    SELECT audsid,
           SYSDATE,
           NULL,
           sys.login_user,
           process,
           TYPE,
           machine,
           osuser,
           sys_context('USERENV', 'IP_ADDRESS'),
           program
      FROM v$session
     WHERE audsid = userenv('SESSIONID');
END;
 
3.创建登出触发器:
CREATE OR REPLACE TRIGGER SYS.LOGIN_OFF_INFO
BEFORE LOGOFF
ON DATABASE
Begin
    update system.login_log set login_off_time=sysdate where session_id=USERENV('SESSIONID');
    exception when others then
        null;
END;


4.日期筛选语句:
查询所有记录
set linesize 300
col USER_IN_DB for a10
col MACHINE for a10
col osuser for a10
col RUN_PROGRAM for a40
SELECT session_id,
       to_char(login_on_time, 'YYYYMMDD HH24:MI:SS'),
       to_char(login_off_time, 'YYYYMMDD HH24:MI:SS'),
       user_in_db,
       process,
       TYPE,
       machine,
       osuser,
       ip_address,
       run_program
  FROM system.login_log;

DDL触发器
1. 创建ddl记录表
create table system.ddl_log
(
 ddl_date date,
 session_id number,
 os_user VARCHAR2(30),
 machine  VARCHAR2(64),
 user_name varchar2(30),
 ip_addr VARCHAR2(20),
 obj_name VARCHAR2(128),
 ddl_type      VARCHAR2(30),
 object_type   VARCHAR2(19),
 owner         VARCHAR2(30),
 SQL_TEXT      VARCHAR2(1000)
) tablespace TS_AUDIT_MON;
create index system.idx_ddl_log1 on system.ddl_log (ddl_date desc,session_id) tablespace TS_AUDIT_MON;
create index system.idx_ddl_log2 on system.ddl_log (user_name,session_id) tablespace TS_AUDIT_MON;


2.创建数据库级DDL触发器,记录所有ddl操作
CREATE OR REPLACE TRIGGER sys.ddl_audit
  AFTER CREATE OR ALTER OR drop OR truncate OR grant OR revoke OR rename ON DATABASE
DECLARE
  session_id_var NUMBER;
  osuser_var     VARCHAR2(30);
  machine_var    VARCHAR2(64);
  ipaddr_var     VARCHAR2(20);
  stext          VARCHAR2(1000);
BEGIN
  BEGIN
    SELECT sys_context('USERENV', 'SESSIONID'),
           sys_context('USERENV', 'OS_USER'),
           sys_context('USERENV', 'HOST'),
           sys_context('USERENV', 'IP_ADDRESS')
      INTO session_id_var, osuser_var, machine_var, ipaddr_var
      FROM dual;
  EXCEPTION
    WHEN OTHERS THEN
      NULL;
  END;
  BEGIN
    SELECT sql_text
      INTO stext
      FROM v$open_cursor
     WHERE upper(sql_text) LIKE 'ALTER%'
        OR upper(sql_text) LIKE 'TRUNCATE%'
        OR upper(sql_text) LIKE 'DROP%'
        OR upper(sql_text) LIKE 'CREATE%'
        OR upper(sql_text) LIKE 'GRANT%'
        OR upper(sql_text) LIKE 'REVOKE%'
        OR upper(sql_text) LIKE 'RENAME%';
  EXCEPTION
    WHEN OTHERS THEN
      stext := '-';
  END;
  INSERT INTO system.ddl_log
    (ddl_date,
     session_id,
     os_user,
     machine,
     user_name,
     ip_addr,
     obj_name,
     ddl_type,
     object_type,
     owner,
     sql_text)
  VALUES
    (SYSDATE,
     session_id_var,
     osuser_var,
     machine_var,
     USER,
     ipaddr_var,
     nvl(ora_dict_obj_name, '-'),
     nvl(ora_sysevent, '-'),
     nvl(ora_dict_obj_type, '-'),
     nvl(ora_dict_obj_owner, '-'),
     stext);
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
/


3.查询语句
查询所有记录
set linesize 300
col MACHINE for a10
col os_user for a10
col USER_NAME for a10
col ip_addr for a16
col obj_name for a15
col DDL_TYPE for a10
col object_type for a10
col owner for a10
col sql_text for a30
SELECT to_char(ddl_date, 'YYYYMMDD HH24:MI:SS'),
       session_id,
       os_user,
       machine,
       user_name,
       ip_addr,
       obj_name,
       ddl_type,
       object_type,
       owner,
       sql_text
  FROM system.ddl_log;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值