只针对此表:create or replace trigger bak_trigger
before update or delete on emp
for each row
begin
if updating then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,NEW_VALUE,OPERATE_TIME,OPERATER)
values('update','emp',:old.EMPNO||','||:old.ENAME||','||:old.JOB||','||:old.MGR,
:new.EMPNO||','||:new.ENAME||','||:new.JOB||','||:new.MGR,sysdate,user);
end if;if deleting then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,OPERATE_TIME,OPERATER)
values('update','emp',:old.EMPNO||','||:old.ENAME||','||:old.JOB||','||:old.MGR,
sysdate,user);
end if;end;
/
before update or delete on emp
for each row
begin
if updating then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,NEW_VALUE,OPERATE_TIME,OPERATER)
values('update','emp',:old.EMPNO||','||:old.ENAME||','||:old.JOB||','||:old.MGR,
:new.EMPNO||','||:new.ENAME||','||:new.JOB||','||:new.MGR,sysdate,user);
end if;if deleting then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,OPERATE_TIME,OPERATER)
values('update','emp',:old.EMPNO||','||:old.ENAME||','||:old.JOB||','||:old.MGR,
sysdate,user);
end if;end;
/
解决方案 »
- Oracle数据库之间传输数据如何加密传输
- win7 下orcale 10g 端口被使用问题~~
- 如何重组表空间
- 新手求助 ORA-00936 标准表单查询出错
- 数据库从Oracle9升级到Oracle10,jdk1.4升级到jdk1.6时,原有的java程序如何改呢?
- 添加数据出现特殊字符
- 求CNOUG论坛(Oracle.com.cn)邀请码一个,谢谢!
- 两个SELECT语句执行后产生两个结果集,想将这两个结果集合并成一个结果集
- 求助:如何查询数据库中有多少条数据?
- oracle表空间TEMP01.DBF文件改小的问题,请高手指教阿!
- 新手问一下一条sql查询语句
- 求助:AIX5下的ORACLE9i在新建DB时出错
after delete or update on emp
for each row
declare
begin
if deleting then
insert into bk_tab (OPERATION_TYPE,TABLE_NAME ,OLD_VALUE ,NEW_VALUE ,OPERATE_TIME ,OPERATER )
values ('delete','emp',
'EMPNO:'||:old.EMPNO||',ENAME:'||:old.ENAME||',JOB:'||:old.JOB||',MGR:'||:old.MGR,
'EMPNO: ,ENAME: ,JOB: ,MGR: ',
sysdate, user );
elsif updating then
insert into bk_tab (OPERATION_TYPE,TABLE_NAME ,OLD_VALUE ,NEW_VALUE ,OPERATE_TIME ,OPERATER )
values ('update','emp',
'EMPNO:'||:old.EMPNO||',ENAME:'||:old.ENAME||',JOB:'||:old.JOB||',MGR:'||:old.MGR,
'EMPNO:'||:new.EMPNO||',ENAME:'||:new.ENAME||',JOB:'||:new.JOB||',MGR:'||:new.MGR,
sysdate, user );
end if;
end TRIGGER_TEST;
before update or delete on emp
for each row
begin
if updating then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,NEW_VALUE,OPERATE_TIME,OPERATER)
values('update','emp','EMPNO:'||:old.EMPNO||','||'ENAME:'||:old.ENAME||','||'JOB:'||:old.JOB||','||'MGR:'||:old.MGR,
'EMPNO:'||:new.EMPNO||','||'ENAME:'||:new.ENAME||','||'JOB:'||:new.JOB||','||'MGR:'||:new.MGR,sysdate,user);
end if;if deleting then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,NEW_VALUE,OPERATE_TIME,OPERATER)
values('delete','emp','EMPNO:'||:old.EMPNO||','||'ENAME:'||:old.ENAME||','||'JOB:'||:old.JOB||','||'MGR:'||:old.MGR,
'EMPNO:'||:new.EMPNO||','||'ENAME:'||:new.ENAME||','||'JOB:'||:new.JOB||','||'MGR:'||:new.MGR,sysdate,user);
end if;end;
/
before update or delete on emp
for each row
begin
if updating then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,NEW_VALUE,OPERATE_TIME,OPERATER)
values('update','emp',:old.EMPNO||','||:old.ENAME||','||:old.JOB||','||:old.MGR,
:new.EMPNO||','||:new.ENAME||','||:new.JOB||','||:new.MGR,sysdate,user);
end if;if deleting then
insert into bk_tab(OPERATION_TYPE,TABLE_NAME,OLD_VALUE,OPERATE_TIME,OPERATER)
values('delete','emp',:old.EMPNO||','||:old.ENAME||','||:old.JOB||','||:old.MGR,
sysdate,user);
end if;end;
/
关于OLD_VALUE和NEW_VALUE:
OLD_VALUE:emp表updata/delete前更新行各个字段的值,记录格式为:EMPNO:111,ENAME:aaa,JOB:bbb,MGR:222
NEW_VALUE:emp表updata/delete后更新行各个字段的值,记录格式为:EMPNO:000,ENAME:aaa,JOB:bbb,MGR:222各个字段不希望写死,因为表结构要使变化了,还要重新写trigger,希望通过查询数据库表结构的结果,将表的字段和值记录下来实在抱歉谢谢
更新的时候使用的 :old.empno这些字段也是需要重写的,如果在触发器里查询表结构,通过循环拼出插入的OLD_VALUE和NEW_VALUE字段和其他字段等效率是很不好的;
before update or delete on a111
for each row
declare
v_table_name varchar2(50);
v_text varchar2(4000);
v_text_old varchar2(4000);
v_text_new varchar2(4000);
v_sql_old varchar2(4000);
v_sql_new varchar2(4000);
begin
v_table_name := a111;
for c_col in (select t.COLUMN_NAME, t.DATA_TYPE
from user_tab_columns t
where t.table_name = v_table_name) loop
v_sql_old := 'select old.'||c_col.column_name||' from dual';
execute immediate v_sql_old returning into v_text;
v_text_old:=v_text_old||c_col.column_name||':'||v_text||',';
v_sql_new := 'select new.'||c_col.column_name||' from dual';
execute immediate v_sql_new returning into v_text;
v_sql_new:=v_sql_new||c_col.column_name||':'||v_text||',';
end loop; if updating then
insert into bk_tab
(OPERATION_TYPE,
TABLE_NAME,
OLD_VALUE,
NEW_VALUE,
OPERATE_TIME,
OPERATER)
values
('update',
v_table_name,
v_text_old,
v_sql_new,
sysdate,
user);
end if; if deleting then
insert into bk_tab
(OPERATION_TYPE,
TABLE_NAME,
OLD_VALUE,
NEW_VALUE,
OPERATE_TIME,
OPERATER)
values
('delete',
v_table_name,
v_text_old,
v_sql_new,
sysdate,
user);
end if;end;
*
ERROR 位于第 1 行:
ORA-00904: "OLD"."EMPNO": 无效的标识符
ORA-06512: 在"SCOTT.BAK_TRIGGER", line 16
ORA-04088: 触发器 'SCOTT.BAK_TRIGGER' 执行过程中出错请问如何解决,谢谢
1、建bk_tab表的目的是什么?只是为了记录什么时间执行了那些操作吗?还是有其他的考虑
2、bk_tab表结构设计是否合理?
因为现有表emp结构简单,并不具有普遍性,如果表的结构复杂,例如:列类型的改变(blob,clob等等)、列的增加等等),这些都可能导致bk_tab表现有列无法存储。
3、是否考虑过其他的实现方式(如添加标识列、表复制、日志等等),为什么最后选择这样做
----------
select column_name from user_tab_columns where table_name='yourtable'
可以在trigger里写
不知道水清老大还有什么更好的办法么?
----------
方法有很多,关键是要找一个合适的方法。
可以在trigger里写
==============================
但是怎么拼成可以记录原值和新值得sql?方法有很多,关键是要找一个合适的方法。
==============================
根据我的需求,您认为那个方法最合适。谢谢