table的datatype重組後問題

[复制链接]
查看11 | 回复7 | 2006-9-7 17:09:08 | 显示全部楼层 |阅读模式
oracle有一個為online table redefinition功能,專門改變table架構,如:
(1).非partition table改變為partition table
(2).更改table參數
(3).重整table資料
(4).改變datatype長度
我的問題是公司中某一個table連結view有200個,使用online table redefinition造成200個view呈現invalid,除了下列兩種方法外,oracle是否提供第三種方法解決問題
(1).200個view一個一個compile
(2).寫程式修改

請問各位先進,其問題如何解決?


回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
用 alter view view_name compile 重新编译视图, 如果编译不通过的话, 那么就要修改视图了(可能是因为表结构变更引起的视图编译错误)
如果是用pl/sql developer, 可以通过它的编译功能重新快速编译所有需要编译的视图
如果没有工具, 那么通过字典表 user_objects 找出所有需要 status = 'INVALID' 的视图, 生成alter语句, 并执行得到的alter语句
[php]
SELECT 'ALTER VIEW '||OBJECT_NAME||' COMPILE;'
FROM user_objects
WHERE object_type = 'VIEW'
AND status = 'INVALID';
----------------------
[/php]
回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
dbms_utility.compile_schema()
这个过程可以修复一个schema下无效的objects
回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
最初由 喃喃 发布
[B]dbms_utility.compile_schema()
这个过程可以修复一个schema下无效的objects [/B]

DBMS_UTILITY.COMPILE_SCHEMA()并不是对所有对象类型都起作用的. 限于procedure(过程), function(函数), package(包)和trigger(触发器).
下面是官方的说明:
[php]
This procedure compiles all procedures, functions, packages, and triggers in the specified schema.
[/php]
回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
最初由 jackywood 发布
[B]用 alter view view_name compile 重新编译视图, 如果编译不通过的话, 那么就要修改视图了(可能是因为表结构变更引起的视图编译错误)
如果是用pl/sql developer, 可以通过它的编译功能重新快速编译所有需要编译的视图
如果没有工具, 那么通过字典表 user_objects 找出所有需要 status = 'INVALID' 的视图, 生成alter语句, 并执行得到的alter语句
[php]
SELECT 'ALTER VIEW '||OBJECT_NAME||' COMPILE;'
FROM user_objects
WHERE object_type = 'VIEW'
AND status = 'INVALID';
----------------------
[/php] [/B]


謝謝你的提供建議,公司資料庫中因為每一個user object有許多view,view全部總和約為幾萬個,是否有方法找到view屬於哪一個user object
回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
最初由 jackywood 发布
[B]
DBMS_UTILITY.COMPILE_SCHEMA()并不是对所有对象类型都起作用的. 限于procedure(过程), function(函数), package(包)和trigger(触发器).
下面是官方的说明:
[php]
This procedure compiles all procedures, functions, packages, and triggers in the specified schema.
[/php] [/B]

多谢指教!
回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
最初由 tomaslien 发布
[B]

謝謝你的提供建議,公司資料庫中因為每一個user object有許多view,view全部總和約為幾萬個,是否有方法找到view屬於哪一個user object [/B]

user_objects显示当前用户下的对象
all_objects显示所有用户下的对象, 有字段 OWNER 来标识出对象所属的用户, 编译命令改为
alter view OWNER.VIEW_NAME compile
字典表选用all_objects就可以了
如果你们实际碰到这种情况的几率比较大,
就一次性写个脚本,
脚本功能如下:
1.重新编译所有需要重新编译的视图,
2.显示重新编译后所有编译未通过的视图及错误信息
如果你们除了视图, 其他对象也需要重新编译,
可以通过类似的方法,重新编译可以使用DBMS_UTILITY.COMPILE_SCHEMA()
回复

使用道具 举报

千问 | 2006-9-7 17:09:08 | 显示全部楼层
最初由 tomaslien 发布
[B]

謝謝你的提供建議,公司資料庫中因為每一個user object有許多view,view全部總和約為幾萬個,是否有方法找到view屬於哪一個user object [/B]

通过 all_view 可以看到每个视图的SQL,就能找到都涉及了哪些object了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行