day09-2視圖和用戶權限

視圖和用戶權限1.視圖(view)

  • 看一個需求
    emp表的列信息很多,有些信息是個人重要信息(比如:sal、comm、mgr、hiredate),如果我們希望某個用戶只能查詢emp表的empno、enamel、job和deptno信息,有什么辦法呢?
    答案是使用視圖 。

day09-2視圖和用戶權限

文章插圖
1.1基本原理
  1. 視圖是一個虛擬表,其內容由查詢定義 。同真實的表一樣,視圖包含列,其數據來自對應的真實的表(基表)
    視圖和基表關系的示意圖:
    day09-2視圖和用戶權限

    文章插圖
  2. 對視圖的總結
    • 視圖是根據基表(可以是多個基表)來創建的,視圖是虛擬的表
    • 視圖也有列,數據來自基表
    • 通過視圖可以修改基表的數據
    • 基表的改變也會影響到視圖的數據
1.2視圖使用細節
  • 語法
1. create view 視圖名 as select 語句 -- 創建一個視圖2. alter view 視圖名 as select 語句 -- 修改視圖,更新成新的視圖3. show create view 視圖名 -- 顯示創建視圖的指令4. drop view 視圖名1[,視圖名2,...] -- 刪除視圖
例子
完成前面提出的需求
創建一個視圖emp_view01,只能查詢emp表的empno、ename、job和deptno列的信息
SELECT * FROM emp;-- 創建一個視圖emp_view01,只能查詢emp表的empno、ename、job和deptno列的信息-- 創建視圖CREATE VIEW emp_view01 AS SELECT empno,ename,job,deptno FROM emp;-- 查看視圖DESC emp_view01;SELECT * FROM emp_view01;SELECT empno, job FROM emp_view01;-- 顯示創建視圖的指令SHOW CREATE VIEW emp_view01; -- 刪除視圖DROP VIEW emp_view01;
  • 視圖細節討論
  1. 創建視圖后,到數據庫去看,對應的視圖只有一個視圖結構文件(形式:視圖名.frm)
    視圖的數據只是來源于基表,本身是沒有數據的(一個映射關系)
  2. 視圖的數據變化會影響到基表,基表的數據變化也會影響到視圖 [insert , delete,update]
  3. 視圖中可以再使用視圖,數據仍然來自基表
-- 視圖細節討論-- 1. 創建視圖后,到數據庫去看,對應的視圖只有一個視圖結構文件-- (形式:視圖名.frm)-- 2. 視圖的數據變化會影響到基表 [insert,delete,update]UPDATE emp_view01 SET job = 'MANAGER' WHERE empno=7369;-- 修改視圖SELECT * FROM emp; -- 查詢基表, , 發現數據變了-- 基表的數據變化也會影響到視圖UPDATE emp SET job = 'SALESMAN' WHERE empno=7369;-- 修改基表SELECT * FROM emp_view01; -- 查詢視圖,發現數據變了-- 3. 視圖中可以再使用視圖,比如從emp_view01視圖中選出empno和ename做出新的視圖CREATE VIEW emp_view02 AS SELECT empno,ename FROM emp_view01;1.3視圖應用實例
  • 視圖最佳實踐
  1. 安全:
    一些數據表有著重要的信息 。有些字段是保密的,不能讓用戶直接看到 。這時就可以創建一個視圖,在這張視圖中只保留一部分字段 。這樣,用戶就可以查詢自己需要的字段,不能查看保密的字段 。
  2. 性能:
    關系數據庫的數據常常會分表存儲,使用外鍵建立這些表之間的關系 。這時,數據庫查詢經常會用到連接(JOIN) 。這樣做不但麻煩,效率相對也比較低 。如果建立一個視圖(基于多個基表),將相關的表和字段組合在一起,就可以避免使用JOIN查詢數據 。
  3. 靈活:
    如果系統中有一張舊的表,這張表由于設計的問題即將被廢棄 。然而 , 很多應用都是基于這張表,不易修改 。這時就可以建立一張視圖,視圖中的數據直接映射到新的表 。這樣就可以少做很多改動,也達到了升級數據表的目的 。