freefly
          一門技術,如果不能講出來,那么就是沒有理解,如果不能很好的講出來,那么就是理解不夠透徹!
          posts - 9,comments - 3,trackbacks - 0

           

                視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態生成。

                對其中所引用的基礎表來說,視圖的作用似于篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。分布式查詢也可用于定義使用多個異類源數據的視圖。如果有幾臺不同的服務器分別存儲組織中不同地區的數據,而您需要將這些服務器上相似結構的數據組合起來,這種方式就很有用。

                通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。


          一、視圖的作用

                * 簡單性。看到的就是需要的。視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件。

                * 安全性。通過視圖用戶只能查詢和修改他們所能見到的數據。數據庫中的其它數據則既看不見也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定的列上。通過視圖,用戶可以被限制在數據的不同子集上:

                使用權限可被限制在基表的行的子集上。
                使用權限可被限制在基表的列的子集上。
                使用權限可被限制在基表的行和列的子集上。
                使用權限可被限制在多個基表的連接所限定的行上。
                使用權限可被限制在基表中的數據的統計匯總上。
                使用權限可被限制在另一視圖的一個子集上,或是一些視圖和基表合并后的子集上。

                * 邏輯數據獨立性。視圖可幫助用戶屏蔽真實表結構變化帶來的影響。

          二、視圖的優點

                (1)視圖能簡化用戶的操作
                (2)視圖機制可以使用戶以不同的方式查詢同一數據
                (3)視圖對數據庫重構提供了一定程度的邏輯獨立性
                (4)視圖可以對機密的數據提供安全保護

          三、視圖的安全性

                視圖的安全性可以防止未授權用戶查看特定的行或列,是用戶只能看到表中特定行的方法如下:

                1 在表中增加一個標志用戶名的列;

                2 建立視圖,是用戶只能看到標有自己用戶名的行;

                3 把視圖授權給其他用戶。

          四、邏輯數據獨立性

                視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來。視圖可以在以下幾個方面使程序與數據獨立:

                1 如果應用建立在數據庫表上,當數據庫表發生變化時,可以在表上建立視圖,通過視圖屏蔽表的變化,從而應用程序可以不動。

                2 如果應用建立在數據庫表上,當應用發生變化時,可以在表上建立視圖,通過視圖屏蔽應用的變化,從而使數據庫表不動。

                3 如果應用建立在視圖上,當數據庫表發生變化時,可以在表上修改視圖,通過視圖屏蔽表的變化,從而應用程序可以不動。

                4 如果應用建立在視圖上,當應用發生變化時,可以在表上修改視圖,通過視圖屏蔽應用的變化,從而數據庫可以不動。

          五、視圖的書寫格式

          CREATE VIEW <視圖名>[(列名組)]
          AS <子查詢>

          DROP VIEW <索引名>

          注意:視圖可以和基本表一樣被查詢,但是利用視圖進行數據增,刪,改操作,會受到一定的限制。

          (1)由兩個以上的基本表導出的視圖
          (2)視圖的字段來自字段表達式函數
          (3)視圖定義中有嵌套查詢
          (4)在一個不允許更新的視圖上定義的視圖

          六、創建和管理視圖

          (創建視圖時注意事項的介紹)

          (一). 利用企業管理器創建與管理視圖

                1.使用企業管理器創建視圖:
                2.使用企業管理器的“向導”創建視圖:   
                3.使用企業管理器的修改視圖:
                注意:在 “設計視圖”時完成的工作:
            添加表/刪除表 ?添加引用字段/刪除引用字段 ?調整字段順序 ?設置分組
            設置過濾條件 ?設置引用字段是否輸出 ?設置視圖其他屬性
                4.使用企業管理器的刪除視圖:

          (二). 用T-SQL語句創建與管理視圖

                (查看由企業管理器創建的視圖—“項目信息”其相應的T-SQL語句)(“視圖屬性”)
                1. 使用CREATE VIEW創建視圖的語法: 參見教材p130~135
                例子1: 選擇‘員工表’和‘項目表’中的部分字段和記錄創建視圖,并且限制表‘員工表’ 中的記錄只能是部門為“項目部”的記錄集合,視圖定義為view_part,其程序清單如下:

          CREATE VIEW view_part
          AS
          SELECT 員工表.編號, 員工表.姓名,員工表.性別,
          員工表.所屬部門, 項目表.項目編號, 項目表.名稱
          FROM 項目表 INNER JOIN 員工表 ON 項目表.負責人 = 員工表.編號
          WHERE 員工表.所屬部門='項目部'

          例子2:定義視圖時指定別名并加密

          CREATE VIEW 項目信息視圖
          (項目名稱,項目客戶,項目負責人,開始日期,[計劃工期(天)])
          with encryption
          AS
          SELECT 項目表.名稱,客戶表.客戶名稱, 員工表.姓名,項目表.開始日期,
          DATEDIFF(day,項目表.開始日期,項目表.結束日期)
          FROM 項目表 INNER JOIN 員工表 ON 項目表.負責人 = 員工表.編號
          INNER JOIN 客戶表 ON 項目表.客戶 = 客戶表.客戶編號
          WHERE 員工表.所屬部門='項目部'

          使用語句:exec sp_helptext ‘項目信息視圖’顯示消息為:
          “對象備注已加密。” 

          操作結果如下圖所示

          例子5-3:使用WITH CHECK OPTION子句
          問題提出:
          若創建視圖ygb_view,其程序清單如下:

          CREATE VIEW ygb_view
          AS
          SELECT * FROM 員工表
          WHERE 員工表.性別=‘女’執行下列語句,插入新記錄:
          INSERT INTO ygb_view(姓名,性別,工資)
          values(‘李立三’,‘男’,2300)


          插入操作成功,但不合理!
          解決辦法:使用with check option,程序清單如下:

          CREATE VIEW ygb_view
          AS
          SELECT * FROM 員工表 WHERE 員工表.性別=‘女’With check option

          同樣,插入新記錄:
          INSERT INTO ygb_view(姓名,性別,工資) values(‘李立三’,‘男’,2300)
          插入操作將失敗!

          2.使用ALTER VIEW修改視圖 語法:參見教材
          3.刪除視圖DROP VIEW
            使用DROP VIEW命令刪除視圖的語法如下: DROP VIEW 視圖名1 [, ……]
          例: DROP VIEW ygb_view

          七、使用視圖操作表數據

          (一)、通過視圖添加表數據

            使用INSERT語句實現。
            注意:視圖是虛擬表,其本身不存儲數據(來自其引用表), 添加的數據是存儲于視圖參照的數據表中。

          條件分析:
          1)用戶有向數據表插入數據的權限;
          2)視圖只引用表中部分字段,插入數據時只能是明確其應用的字段取值;
          3)未引用的字段應具備下列條件之一:
            允許空值;設有默認值;是標識字段;數據類型是timestamp或uniqueidentifer;
          4)視圖不能包含多個字段的組合
          5)視圖不能包含使用統計函數的結果;
          6)視圖不能包含DISTINCT或GROUP BY子句;
          7)定義視圖使用WITH CHECK OPTION,則插入數據應符合相應條件;
          8)若視圖引用多個表,一條INSERT語句只能同一個基表表中數據;

          例:
          首先創建了一個新的視圖:

          CREATE VIEW ygb_view
          AS
          SELECT * FROM 員工表 WHERE 員工表.性別=‘女’ with check option

          然后,通過執行以下語句使用該視圖向基表添加一條新的數據記錄:
          INSERT INTO ygb_view(姓名,性別,工資) values(‘李立平’,‘女’,2300)

          (二). 更新數據記錄
            使用視圖可以更新基表數據記錄(注意使用INSERT時的限制同樣適用)。
          例子3:
          (1) update 項目_view
            set 項目負責人= ‘王大力’ where 項目負責人= ‘王立兵’
          (2) update 項目_view
            set 結束日期= DATEADD(day, 50, 結束日期) where 客戶名稱=‘CCH公司’

          (三)、刪除數據記錄
            利用DELETE語句,使用視圖刪除記錄,可以刪除任何基表中的記錄。
            注意: 必須指定在視圖中定義過的字段來刪除記錄;
               視圖引用多個表時,無法用DELETE命令刪除數據。
          例子4:delete ygb_view where 員工工資<1500

          posted on 2007-11-18 21:39 freefly 閱讀(165) 評論(0)  編輯  收藏 所屬分類: database

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 绥化市| 田林县| 恩施市| 靖边县| 临泽县| 通城县| 安顺市| 高邮市| 龙川县| 咸阳市| 武义县| 鹤岗市| 华蓥市| 富顺县| 密云县| 贵德县| 张家川| 镇雄县| 刚察县| 黄骅市| 青河县| 桐梓县| 濮阳市| 河东区| 秭归县| 界首市| 古交市| 涟源市| 西乌珠穆沁旗| 镇雄县| 承德市| 米易县| 马公市| 临沭县| 报价| 怀远县| 瑞金市| 定安县| 屏山县| 通江县| 寻甸|