因为工作需要监测哪些用户修改了数据库中的数据表。在参考了
http://www.psoug.org/reference/ddl_trigger.html内容后,做了如下设计:
1.以system用户登录。
2 -- 创建数据表
3 -- 创建存储过程
1.以system用户登录。
2 -- 创建数据表
- create table csm_ddl_audit_log
- (
- USER_NAME VARCHAR2(64),
- DDL_DATE DATE,
- DDL_TYPE VARCHAR2(64),
- OBJECT_TYPE VARCHAR2(32),
- OWNER VARCHAR2(64),
- OBJECT_NAME VARCHAR2(128),
- IP_ADDRESS VARCHAR2(40),
- TERMINAL VARCHAR2(64)
- );
- create index CONS_DDL_LOG on csm_ddl_audit_log (IP_ADDRESS);
3 -- 创建存储过程
- CREATE OR REPLACE TRIGGER ddl_trigger
- AFTER CREATE OR ALTER OR DROP ON SCOTT.SCHEMA
- /* 这里可以更改为需要监测的数据库用户 */
- BEGIN
- IF ora_dict_obj_type = 'TABLE' or ora_dict_obj_type='INDEX' THEN
- /* 条件判断,只保存数据表和索引的变更信息 */
- BEGIN
- INSERT INTO csm_ddl_audit_log
- (user_name,
- ddl_date,
- ddl_type,
- object_type,
- owner,
- object_name,
- ip_address,
- terminal)
- VALUES
- (ora_login_user,
- SYSDATE,
- ora_sysevent,
- ora_dict_obj_type,
- ora_dict_obj_owner,
- ora_dict_obj_name,
- SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
- SYS_CONTEXT('USERENV', 'TERMINAL'));
- EXCEPTION
- WHEN OTHERS THEN
- null;
- END;
- END IF;
- END ddl_trigger;