-
一.問題描述
當(dāng)對視圖使用的基表進(jìn)行表結(jié)構(gòu)修改后,會觸發(fā)視圖的無效以及編譯出錯問題,必須重建視圖解決。
二.問題再現(xiàn)
1.Oracle10g環(huán)境
1.1 創(chuàng)建視圖測試用兩張基表:TestTable和TestUser


1.2 創(chuàng)建測試視圖VW_TABLEUSERALL和VW_TABLEUSER
前者使用了TestTable.*, 后者顯示指定列。


查詢視圖的狀態(tài)如下:全部是Valid狀態(tài)

1.3 修改TestTable表結(jié)構(gòu):增加一列Col1

再次查詢視圖的狀態(tài)如下:全部是INVALID狀態(tài)

1.4 重新編譯兩張視圖

重新查詢視圖的狀態(tài)如下:全部是Valid狀態(tài):

查詢視圖的數(shù)據(jù):VW_TableUserAll查詢出錯。

1.5 視圖重建

重新查詢視圖的數(shù)據(jù):VW_TableUserAll查詢正常: 新增的Col1出現(xiàn)了!

2. Oracle11g環(huán)境
2.1 環(huán)境準(zhǔn)備
和Orale10g下的1.1 和1.2 步驟一致
2.2 修改TestTable表結(jié)構(gòu):增加一列Col1

查詢視圖的狀態(tài)如下:全部是VALID狀態(tài)

2.3 查詢視圖VW_TableUserAll,沒有新增的Col1這一列!

但是基表TestTable中存在Col1這一列

2.4 重新編譯視圖,依舊查不到Col1這一列

2.5 重建視圖,問題解決


3. 問題結(jié)論
Oracle10g環(huán)境下:
對視圖基表的修改會觸發(fā)view的無效。如果視圖中使用了修改的基表表結(jié)構(gòu),重新編譯視圖無法解決問題,視圖需要重建。
Oracle11g環(huán)境下:
對視圖基表的修改不會觸發(fā)view的無效。如果視圖中使用了修改的基表表結(jié)構(gòu),重新編譯視圖無法解決問題,視圖需要重建。
因此:
如果修改了視圖使用到的基表的表結(jié)構(gòu)被修改了,恰如視圖中涉及了修改后的表結(jié)構(gòu),重新編譯視圖操作,仍無法查詢到修改的列,必須進(jìn)行視圖重建。
轉(zhuǎn)自:http://www.rzrgm.cn/tianqing/p/3749729.html
浙公網(wǎng)安備 33010602011771號