AUL恢复Oracle触发器?

    AUL的数据恢复主要关注于数据本身, 象触发器代码AUL虽不自动整理, 但它们也不过是存放在系统表空间中的数据, 还是可以恢复的. 原理是将系统表的数据导出来, 再导入到新的库中, 然后自已 写SQL语句来进行查询, 就可以获得重建触发器的角本了.

    需要导出下面几个系统表的数据.

unload table sys.USER$ to sys_user.txt;
unload table sys.OBJ$ to sys_obj.txt;
SET FIELD_TAG \x07
SET RECORD_TAG \x06
unload table sys.TRIGGER$ to sys_trigger.txt;

    调用建表角本, 创建表.

@USER$_syntax.sql
@OBJ$_syntax.sql
@TRIGGER$_syntax.sql

    运行sqlldr将数据导入到新的库, 注意不要将这些数据导入到SYS用户下.

sqlldr test/test control=USER$_sqlldr.ctl
sqlldr test/test control=OBJ$_sqlldr.ctl
sqlldr test/test control=TRIGGER$_sqlldr.ctl

    再写个SQL就可以很方便地获得某个用户下触发器的代码了.

select
   'CREATE OR REPLACE TRIGGER '|| trigger_name || chr(10)||
   decode( substr( trigger_type, 1, 1 ),
           'A', 'AFTER ', 'B', 'BEFORE ', 'I',
           'INSTEAD OF ' ) ||
   triggering_event || ' ON ' || table_owner || '.' ||
   table_name || chr(10) || REF_CLAUSE || chr(10) ||
   decode( instr( trigger_type, 'EACH ROW' ), 0, null,
           'FOR EACH ROW' ), trigger_body
from  (
   select trigusr.name owner, trigobj.name trigger_name,
      decode(t.type#, 0, 'BEFORE STATEMENT',
           1, 'BEFORE EACH ROW',   2, 'AFTER STATEMENT',
           3, 'AFTER EACH ROW',    4, 'INSTEAD OF',
           'UNDEFINED') trigger_type,
   decode(t.insert$*100 + t.update$*10 + t.delete$,
           100, 'INSERT', 010, 'UPDATE', 001, 'DELETE',
           110, 'INSERT OR UPDATE', 101, 'INSERT OR DELETE',
           011, 'UPDATE OR DELETE',
           111, 'INSERT OR UPDATE OR DELETE',
           'ERROR') triggering_event,
   tabusr.name table_owner, tabobj.name table_name,
   'REFERENCING NEW AS '||t.refnewname||' OLD AS '||t.refoldname REF_CLAUSE,
   t.whenclause,decode(t.enabled, 0, 'DISABLED', 1, 'ENABLED', 'ERROR') STATUS,
   t.definition , t.action# trigger_body
   from obj$ trigobj, obj$ tabobj, trigger$ t,
        user$ tabusr, user$ trigusr
   where (trigobj.obj#   = t.obj# and
       tabobj.obj#    = t.baseobject and
       tabobj.owner#  = tabusr.user# and
       trigobj.owner# = trigusr.user# and
       bitand(t.property, 63)     < 8 ))
where table_owner='用户名'
order by owner, trigger_name

    这样也算比较方便了. 这个功能要求系统表空间必需存在.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • I had a hamburger and a fried chicken leg?
  • 我吃一个汉堡包, 一个炸鸡腿.
  • What time do you start work?
  • 你什么时候开始工作?
  • I start work at 8 o'clock.
  • 我八点开始工作.
  • What do you do at work?
  • 你上班干些什么?
  • I answer telephones and do some typing.
  • 我接电话和打字.