第一次在博客園寫博客,寫的不好,請大家多多評論,也希望自己以後對技術探索的更深。 今天下班之後,由於晚上要發版本,所以開發同事必須留下,突然收到一封公司監控預警郵件。 瞄了幾眼,大致的意思就是說 視圖無效。由於視圖查詢的是表,所以開始做實驗測試。 實驗一: 當基表drop列的時候,視圖是否還是有效? ...
第一次在博客園寫博客,寫的不好,請大家多多評論,也希望自己以後對技術探索的更深。
今天下班之後,由於晚上要發版本,所以開發同事必須留下,突然收到一封公司監控預警郵件。
瞄了幾眼,大致的意思就是說 視圖無效。由於視圖查詢的是表,所以開始做實驗測試。
實驗一: 當基表drop列的時候,視圖是否還是有效?
1.新建一張基表:
create table test1(row_id number,cust_no varchar2(100));
2.查看表的表結構
select a.owner,
a.TABLE_NAME,
c.comments,
a.COLUMN_NAME,
a.DATA_TYPE,
a.CHAR_LENGTH,
a.DATA_DEFAULT,
b.comments
from dba_tab_columns a
inner join dba_col_comments b
on a.OWNER = b.owner
and a.TABLE_NAME = b.table_name
and a.COLUMN_NAME = b.column_name
inner join dba_tab_comments c
on a.TABLE_NAME = c.table_name
and a.OWNER = c.owner
where a.owner = upper('SCOTT')
and a.TABLE_NAME = upper('test1')
order by a.COLUMN_ID;
3.創建一張視圖
create or replace view v_test1 as select * from test1;
4.查看視圖的狀態:
5.刪除CUST_NO列,表結構如下:
-- Drop columns
alter table TEST1 drop column cust_no;
6.查看視圖是否還是有效? 此時看到視圖已經無效了
實驗二:
當表新增列的時候,視圖是否還是有效的昵?
1.新建一張測試表,表結構如下:
create table test_add_col(row_id varchar(10),cust_no varchar2(20));
2.創建一張視圖,命令如下:
create or replace view v_test_add_col as select * from test_add_col;
3.查看視圖的狀態,如下:
4.對test_add_col表新增一列,腳本如下:
-- Add/modify columns
alter table TEST_ADD_COL add cust_name VARCHAR2(100);
5.最後查看視圖v_test_add_col 是否還是有效?
select t.status,t.* from dba_objects t where t.OBJECT_NAME = upper('v_test_add_col');
結論:當對錶drop列的時候,對訪問這張表的視圖有影響,要相應的修改視圖。
當對錶add列的時候,對訪問這張表的視圖沒有影響。
當對錶的列的數據類型發生更改的時候,對訪問這張表的視圖沒有影響。