网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  数据变更日志记录表及触发器的自动生成脚本     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:118次  录入:管理员--2008-03-04  
 

本文主要介绍了通用的数据变更日志记录表及触发器的自动生成脚本,大家可以根据自己实际的需要来自行定义。

declare
v_sqlstr varchar2(4000);
begin
--创建slog日志表及触发器
for i in (select tname, tcomments
from ad_tab
where is_slog = 1) loop
begin
execute immediate 'drop table slog_' || i.tname || ' purge';
exception
when others then
null;
end;
execute immediate 'create table slog_' || i.tname ||
' as select 1 log_id,sysdate logdt,'' 
'' action,lpad('' '',100) user_ip,lpad('' '',100) 
user_host, a.* from ' ||
i.tname || ' a';
execute immediate 'comment on table slog_' 
|| i.tname || ' is ''' || i.tcomments || '_log''';
--建触发器
v_sqlstr := 'create or replace trigger 
trg_slog_' || substr(i.tname, 1, 20) || ' 
after insert or update or delete on ' || i.tname || '
for each row
/************************************
created by xsb on 2006-02-05
数据变更日志记录
*************************************/
declare 
v_action char(1);
begin
if inserting then
v_action := ''i'';
elsif updating then
v_action := ''u'';
else
v_action := ''d'';
end if;
--插入或更新记录时
if inserting or updating then
insert into slog_' || i.tname || '
(log_id, logdt, action, user_host, user_ip';
for j in (select column_name
from user_tab_cols
where table_name = i.tname
order by column_id) loop
--表的列名
v_sqlstr := v_sqlstr || ', ' || j.column_name;
end loop;
v_sqlstr := v_sqlstr || ')
values
(seq_sys_log.nextval, sysdate, v_action, 
sys_context(''userenv'',''host''), 
sys_context(''userenv'',''ip_address'')';
for j in (select column_name
from user_tab_cols
where table_name = i.tname
order by column_id) loop
--表的列名
v_sqlstr := v_sqlstr || ', :new.' || j.column_name;
end loop;
v_sqlstr := v_sqlstr || ');
end if;
--删除记录时
if deleting then
insert into slog_' || i.tname || '
(log_id, logdt, action, user_host, user_ip';
for j in (select column_name
from user_tab_cols
where table_name = i.tname
order by column_id) loop
--表的列名
v_sqlstr := v_sqlstr || ', ' || j.column_name;
end loop;
v_sqlstr := v_sqlstr || ')
values
(seq_sys_log.nextval, sysdate, v_action, 
sys_context(''userenv'',''host''), 
sys_context(''userenv'',''ip_address'')';
for j in (select column_name
from user_tab_cols
where table_name = i.tname
order by column_id) loop
--表的列名
v_sqlstr := v_sqlstr || ', :old.' || j.column_name;
end loop;
v_sqlstr := v_sqlstr || ');
end if;
exception
when others then
raise_application_error(-20001, 
'' 触发器执行失败 .. . '' || sqlerrm);
end;';
execute immediate v_sqlstr;
end loop;
end;
/

 
 
上一篇: 如何在oracle中重编译所有无效的存储过程    下一篇: "physical standby"置于read/write状态
  相关文档
Oracle 9i数据库中动态重配置深入分析 04-11
Oracle中通过命令行实现定时操作详解 04-11
oracle数据库buffer busy wait等待事件 (1) 04-17
诊断数据库系统性能 oracle中跟踪sql语句 09-11
详细讲解oracle i/o子系统的配置和设计 (1) 04-30
教你在Oracle数据库中建立透明网关环境 04-11
sql server 2008的新特性概述:集成服务 02-21
怎样才能提高oracle 10g增量备份速度 04-09
对一些代码加密后再放到oracle数据库中 03-06
轻松解决:Oracle8i回滚段表空间的坏块 08-05
oracle数据库定时jobs作业的使用方法 08-04
可以实现故障预防 探测和恢复的maa结构 05-04
使用java调用oracle数据库的存储过程实例 08-12
细化解析:oracle 10g的统计信息工具awr 11-15
讲解为用户提供对回滚操作时间准确评估 06-10
了解oracle体系结构前必须掌握的两个概念 (1) 04-23
两个有用oracle运算:intersect和minus运算 08-14
讲解杀死oracle数据库死锁进程的具体方法 06-24
轻松学会在Oracle中实现时间相加处理 09-01
从多个方面详细讲解sqlplus的使用技巧 (1) 03-04
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息