请教各位关于触发器的问题,在线等 我对数据库不熟悉,现在想写一个触发器用来记录一个表中的哪些字段被修改,修改成了什么,我应当如何来写呢?谢谢各位了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是说字段的值?还是字段的名字?字段的名字的话,就需要用到系统监查了。字段的值的话,NEW.字段名就是新的值,OLD.字段名就是旧的值。想知道什么变化了,比较一下就知道了。 謝謝Croatia 請問能否通過列編號來訪問該字段呢? 你可以通过系统视图来查出你的表中的相应列名,然后 取到列名的数组,你就可以 拼写你想要的代码了。好像是这个视图,你试一下。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 adeclare 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字段值根据表不同字段上的行级触发器,设为相应的的默认值!!方法比较笨,如果很多表要实现这样的功能,性能会很差!!如果没有其它的方法可以考虑一下!! ORACLE 中的单列索引和多列索引 如何优化此sql语句 Java程序将MySQL数据导入Oracle ORACLE 11GR2 DB安装在A服务器,在B电脑安装ORACLE CLIENT,无法链接服务器A 求助SQL语句 请教 ORACLE 一个稍微复杂的SQL文的拼写! 大家看看这个含有in 的sql语句怎样优化 Oracle 11g 如何设置内存参数 求教一个纵表转横表的问题 提示“ORA-01704: 字符串太长“错误如何解决? 谁帮我到metalink上查点东西,非常感谢 偶尔来逛逛,问个问题
請問能否通過列編號來訪問該字段呢?
sys.all_columns
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;
然后为表的每个字段定义一个行级触发器,把修改的值能过:new :old插入到table_log中,
filed字段值根据表不同字段上的行级触发器,设为相应的的默认值!!方法比较笨,如果很多表要实现这样的功能,性能会很差!!
如果没有其它的方法可以考虑一下!!