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
          主站蜘蛛池模板: 乌苏市| 宝鸡市| 封丘县| 洛浦县| 肇源县| 漳平市| 华安县| 西乡县| 炎陵县| 江津市| 宜兴市| 波密县| 宽甸| 黑河市| 平湖市| 即墨市| 三亚市| 沅陵县| 益阳市| 扶沟县| 资源县| 电白县| 诸城市| 遂昌县| 耿马| 拉萨市| 克拉玛依市| 黄梅县| 福泉市| 滁州市| 正宁县| 黄冈市| 浑源县| 娄底市| 静海县| 绥宁县| 嘉峪关市| 临安市| 汶上县| 长宁区| 临沧市|