<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    Oracle視圖管理
    ?
    ??? 很久沒有繼續學習DBA的內容了,因為這中間實在是忙得焦頭爛額啊。最近雖然還是很忙,但是想是想把這一塊盡早結束掉。所以打算先把別的放一放,抓緊時間學習一下這部分內容。今天的內容比較簡單,是關于View的管理,這是最常用的操作,記錄一下,僅為完整性。
    ?
    ?
    一、視圖的創建規則
    ?
    ??? 這里需要注意的一點就是:初始創建用戶如果只是賦予了resource權限的話,那只能默認可以創建table、function、procedure、package等等,但是不包括創建view的權限,如果需要創建view權限,需要專門賦權“CREATE VIEW”或者“CREATE ANY VIEW”權限。
    ?
    ??? 另外需要說明的一點是:視圖的操作權限取決于創建視圖的user對視圖中涉及的table的操作權限大小。例如用戶A創建的關于TABLE_A的視圖VIEW_A,而A對于TABLE_A有select、insert的權限,則如果將這個VIEW_A的select、insert權限賦予用戶B,那么用戶B也將可以對VIEW_A進行select和insert,而無須擁有與TABLE_A操作的權限。同樣,即便B擁有了對VIEW_A所有的操作權限,也不能對VIEW_A進行update等操作。
    ?
    1、創建一個簡單的view
    ?
    create view sales_staff as
    select empno, ename, deptno
    ? from emp
    where deptno = 10
    with check option constraint sales_staff_cnst; --此句用于創建帶有約束的view
    ?
    注意一點:既然是對deptno=10的視圖,不能對任何view無法查詢到的記錄進行修改。
    例如insert into sales_staff values(7654, 'AAA', 30); 是會報錯的。
    ?
    2、Oracle后臺的*展開
    ?
    ??? Oracle在創建view時,會將頂層視圖查詢中的所有通配符(*)展開成列,形成的查詢被存儲在數據字典中。而且會存儲相應字段名的完整大些名稱,如下例所示:
    ?
    create view dept as select * from scott.dept;
    -->
    create "DEPTNO", "DNAME", "LOC" FROM scott.dept;
    ?
    3、帶錯誤創建view
    ?
    ??? 如果要先創建view,后創建table(這種情況還是有實際意義的),那么就需要是喲個“帶錯誤創建視圖”的功能。這樣,當創建視圖時,涉及到不存在的表或現存表中的無效的列,或者當視圖的擁有者不具備所需的權限時,還是能創建視圖并輸入到數據字典。當然這種視圖是不能使用的。
    ?
    ??? 創建的語法是:
    ?
    ??? CREATE FORCE VIEW AS ...
    ?
    ?
    二、視圖數據的更改
    ?
    ??? 關于視圖是否可更改,影響的條件有很多,具體的可以參看我以前的文章《關于Views的Updatable問題》,里面有詳細的論述。但是Oracle是很人性化的軟件,所以我們不需要記那么復雜的東西,我們要查看某個View時候可以更新,只需要查詢USER_UPDATABLE_COLUMNS這個數據字典就可以搞定了。
    ?
    ??? 舉個簡單的例子:
    ?
    SQL> create table test_a (a int,b int);
    ?
    Table created.

    SQL> create view test_view as select a,sum(b) b from test_a group by a;
    ?
    View created.
    SQL> select * from user_updatable_columns where lower(table_name)='test_view';
    ?
    OWNER??????? TABLE_NAME?? COLUMN UPDATA INSERT DELETA
    ------------ ------------ ------ ------ ------ ------
    WANGXIAOQI?? TEST_VIEW??? B????? NO???? NO???? NO
    WANGXIAOQI?? TEST_VIEW??? A????? NO???? NO???? NO
    ??? 可見,包含有匯總函數的view是無法做任何的更改的。
    ?
    ?
    三、視圖的其他操作
    ?
    ??? 視圖的其他操作也的都比較簡單,所以都放在一起了解一下
    ?
    1、更改視圖
    ?
    ??? alter view語句只有一個功能,就是用來重新編譯視圖,即:
    ??? alter view view_name compile;
    ?
    2、刪除視圖
    ?
    ??? 啥也不說了
    ??? drop view view_name;
    ?
    3、替換視圖
    ?
    ??? 因為view不涉及任何的實際數據存儲,所以可以直接drop后重建。當然最合適的做法是 使用create or replace view來替換原有的view。
    ?
    ??? 需要注意的有:
    ??? ● 替換之后也更新了數據字典中的視圖定義
    ??? ● 所有依賴于此view的PLSQL、View會全部失效
    ?
    ?
    四、關于視圖的查看
    ?
    ??? DBA|ALL|USER_VIEWS:查看所有視圖的定義
    ??? DBA|ALL|USER_UPDATABLE_COLUMNS:查看所有字段是否可更新
    ???
    ??? 如果需要查看VIEW創建時的代碼,兩種方法:
    ?
    ??? 1、select text from user_views where view_name = 'VIEW_NAME';
    ?
    ??? 2、select dbms_metadata.get_ddl('VIEW','VIEW_NAME') from dual;
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    posted on 2009-07-17 21:15 decode360 閱讀(832) 評論(0)  編輯  收藏 所屬分類: 08.DBA
    主站蜘蛛池模板: 国产精品免费看久久久香蕉| 亚洲一本一道一区二区三区| 人妻18毛片a级毛片免费看| 97无码免费人妻超级碰碰碰碰| 亚洲成AV人片久久| 免费观看无遮挡www的视频 | 91免费国产视频| 久久91亚洲人成电影网站| a级成人毛片免费图片| 色噜噜AV亚洲色一区二区| 中文字幕高清免费不卡视频| 亚洲国产美女精品久久久久∴| 人妻在线日韩免费视频| 亚洲精品自产拍在线观看动漫| 久久久精品2019免费观看| 亚洲午夜成激人情在线影院 | 91香蕉在线观看免费高清| 中文字幕亚洲免费无线观看日本 | 亚洲人成毛片线播放| 毛片免费视频播放| 国产亚洲综合久久| 亚洲狠狠婷婷综合久久久久| 无码av免费网站| 亚洲日韩乱码中文字幕| 四虎影永久在线高清免费| 亚洲一级片免费看| 亚洲人成亚洲精品| 在线观看视频免费国语| 日韩免费码中文在线观看| 亚洲91av视频| 精品免费国产一区二区| 国产一级婬片A视频免费观看| 亚洲欧洲高清有无| 又大又硬又爽免费视频| 午夜视频免费在线观看| 苍井空亚洲精品AA片在线播放| 亚洲情综合五月天| 成年女人男人免费视频播放| 国产精品午夜免费观看网站| 亚洲制服丝袜一区二区三区| 国产亚洲人成A在线V网站|