在日常业务开发中,经常会遇到很多数据被篡改和遗失的问题,这时候就可以借助触发器和存储过程来稽查期间内是否有对数据进行操纵的人员,建议用于开发及测试环境,生产环境不推荐。
一、DML审计
-- 1.创建需要监视的表
create table AA_USER
(
name VARCHAR2(25),
sex VARCHAR2(5),
a_uid VARCHAR2(255) not null,
birthday DATE
);
-- 2.创建DML审计记录表
create table AUDIT_DML_OBJ(
Opr_Time date default sysdate, /* 操作时间 */
Session_Id NUMBER(*), /* 会话ID */
OS_User VARCHAR2(200), /* 终端OS用户 */
IP_Address VARCHAR2(200), /* 终端IP地址 */
Terminal VARCHAR2(200), /* 终端 */
Host VARCHAR2(200), /* 终端主机名 */
User_Name VARCHAR2(200), /* ORACLE 用户名*/
DML_Type VARCHAR2(64),
TABLE_NAME VARCHAR2(64),
change clob
);
-- 3.利用存储过程,根据表名快速创建触发器(该触发器现仅支持VARCHAR2、DATE和NUMBER字段)
create or replace procedure DML_TRIGGER_PRODUCER(TAB_NAME in varchar2)
AUTHID CURRENT_USER -- 支持存储过程创建表、触发器等
IS
CURSOR col_query IS SELECT column_name as col_name, data_type from user_tab_columns where table_name = upper(TAB_NAME);
V_SQL CLOB; /* 生成触发器的sql */
BEGIN
-- 1.触发器首
V_SQL :=
'create or replace trigger TR_DML_'||upper(TAB_NAME)||'
after insert or update or delete
ON '||upper(TAB_NAME)||' REFERENCING OLD as old New as new
FOR EACH ROW
DECLARE
Session_Id_Var NUMBER; /* 会话ID */
Os_User_Var VARCHAR2(200); /* 终端OS用户 */
IP_Address_Var VARCHAR2(200); /* 终端IP */
Terminal_Var VARCHAR2(200); /* 终端 */
Host_Var VARCHAR2(200); /* 终端主机名 */
OLD_DATA CLOB;
NEW_DATA CLOB;
BEGIN
/* 获取操作用户信息 */
SELECT SYS_CONTEXT(''USERENV'