AUL的数据恢复主要关注于数据本身, 象视图代码AUL虽不自动整理, 但它们也不过是存放在系统表空间中的数据, 还是可以恢复的. 原理是将系统表的数据导出来, 再导入到新的库中, 然后自已 写SQL语句来进行查询, 就可以获得重建视图的角本了.
需要导出下面几个系统表的数据.
unload table sys.USER$ to sys_user.txt;
unload table sys.OBJ$ to sys_obj.txt;
unload table sys.COL$ to sys_col.txt;
SET FIELD_TAG \x07
SET RECORD_TAG \x06
unload table sys.view$ to sys_view.txt;
调用建表角本, 创建表.
@USER$_syntax.sql
@OBJ$_syntax.sql
@COL$_syntax.sql
@VIEW$_syntax.sql
运行sqlldr将数据导入到新的库, 注意不要将这些数据导入到SYS用户下.
sqlldr test/test control=USER$_sqlldr.ctl
sqlldr test/test control=OBJ$_sqlldr.ctl
sqlldr test/test control=COL$_sqlldr.ctl
sqlldr test/test control=VIEW$_sqlldr.ctl
再写个SQL就可以很方便地获得某个用户下视图的代码了. 因为用了SYS_CONNECT_BY_PATH函数, 请在9i或以上版本的数据库上使用.
select
'CREATE OR REPLACE VIEW '||O.NAME||' ('||
replace(c.cols,',',','||chr(10))||')'||CHR(10)||
'as'||chr(10), v.text
from
user$ u, obj$ o, view$ v,
( SELECT COL.OBJ#, COL.COLS
FROM
(SELECT
OBJ#, COL#, substr(SYS_CONNECT_BY_PATH(NAME,','),2) COLS
FROM COL$
WHERE COL# > 0
START WITH COL# = 1
CONNECT BY PRIOR OBJ# = OBJ# AND PRIOR COL# = COL# - 1 ) COL,
(SELECT OBJ#, COUNT(*) COLCNT FROM COL$
WHERE COL# > 0 GROUP BY OBJ#) CN
WHERE COL.OBJ# = CN.OBJ# AND COL.COL# = CN.COLCNT
) C
where u.user#=o.owner# and o.obj# = c.obj#
and v.obj# = o.obj# and u.name='用户名'
这样也算比较方便了. 这个功能要求系统表空间必需存在.