日期:2014-05-17  浏览次数:20664 次

请教各位关于触发器的问题,在线等
我对数据库不熟悉,现在想写一个触发器用来记录一个表中的哪些字段被修改,修改成了什么,我应当如何来写呢?
谢谢各位了.

------解决方案--------------------
你是说字段的值?还是字段的名字?

字段的名字的话,就需要用到系统监查了。

字段的值的话,NEW.字段名就是新的值,OLD.字段名就是旧的值。想知道什么变化了,比较一下就知道了。




------解决方案--------------------
这个我倒是没有试过,我觉得可以。
你可以测试一下。
------解决方案--------------------
你可以通过系统视图来查出你的表中的相应列名,然后 取到列名的数组,你就可以 拼写你想要的代码了。

好像是这个视图,你试一下。
sys.all_columns
------解决方案--------------------
哪些字段被修改这纪录不了吧?
------解决方案--------------------
create table mytail(
SESSION_ID NUMBER,
TIMESTAMP DATE,
DB_USER VARCHAR2(30),
OS_USER VARCHAR2(255),
USERHOST VARCHAR2(128),
CLIENT_IP VARCHAR2(255),
machine VARCHAR2(255),
program VARCHAR2(255),
EXT_NAME VARCHAR2(4000),
OBJECT_SCHEMA VARCHAR2(30),
OBJECT_NAME VARCHAR2(128),
SCN NUMBER,
SQL_TEXT VARCHAR2(4000),
SQL_BIND VARCHAR2(4000));


create or replace trigger atest
after DELETE OR INSERT OR UPDATE ON a
declare
n number;
stmt varchar2(4000);
sql_text ora_name_list_t;
begin
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
stmt := stmt || sql_text(i);
END LOOP;
insert into mytail
(SESSION_ID, DB_USER, CLIENT_IP, SQL_TEXT, OBJECT_NAME, OBJECT_SCHEMA)
values
(USERENV('SESSIONID'),
user,
sys_context('userenv', 'ip_address'),
stmt,
'T1',
'RAINY');

end;
------解决方案--------------------
从oracle 9.0.7版本开始,6楼的方法就不起作用了。ora_sql_txt方法始终返回空。需要系统事情触发器的支持
------解决方案--------------------
建立一个记录表table_log(filed,new,old,time)
然后为表的每个字段定义一个行级触发器,把修改的值能过:new :old插入到table_log中,
filed字段值根据表不同字段上的行级触发器,设为相应的的默认值!!

方法比较笨,如果很多表要实现这样的功能,性能会很差!!
如果没有其它的方法可以考虑一下!!