全面學習MySQL中的檢視(1) 檢視安全驗證的方式
全面學習MySQL中的檢視(1) 檢視安全驗證的方式
一、檢視的建立
MySQL資料庫中的View在標準SQL的基礎之上做了些擴充套件,這主要體現在幾個方式:
- DEFINER:指定檢視的建立者(或者說屬主,雖然MySQL中的物件其實不注重屬主,這點與ORACLE資料庫極為不同),預設當然就是執行CREATE VIEW語句的CURRENT_USER,但是建立時也可以指定不同的使用者做為建立者(或者叫檢視所有人);
- SQL SECURITY:檢視查詢資料時的安全驗證方式,有兩處選項:
- DEFINER:這個不是指建立者了,而是說在建立檢視時驗證是否有許可權訪問檢視所引用的資料;
- INVOKER:指查詢檢視時,驗證查詢的使用者是否擁有許可權訪問檢視及檢視所引用的物件;
- ALGORITHM:指定檢視的處理方式,有三種選項:
- MERGE:將檢視的定義和查詢檢視的語句合併處理,。
- TEMPTABLE:檢視查詢的結果儲存到臨時表,而後在該臨時表基礎上執行查詢檢視的語句;
- UNDEFINED:由MySQL選擇使用哪種演算法,一般會首選MERGE,因為MERGE更有效率,再說TEMPTABLE也不支援更新操作。
下面分別通過例項來闡述上面這幾個選項。
先列出MySQL資料庫中檢視的建立語法:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
- [WITH [CASCADED | LOCAL] CHECK OPTION]
1.1 指定檢視安全驗證的方式
所謂安全驗證的方式,核心還是許可權 - 是否有足夠的許可權去訪問希望訪問到的資料。檢視相對其實更復制一些,這裡先介紹最簡單的情況:查詢檢視,對檢視所引用的基表的許可權驗證。
提示:
- 三思個人感覺這個概念與ORACLE中的定義者許可權和呼叫者許可權過程非常類似。
例如,引用同一個物件,按照不同的方式建立兩個檢視:
-
mysql> create sql security definer view j1_v_d as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)
mysql> create sql security invoker view j1_v_i as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)
然後我們新建一個使用者tmpdb,僅授予增刪改查tmpdb庫的許可權(並沒有操作jssdb.j1的許可權):
-
mysql> grant select,insert,update,delete on tmpdb.* to tmpdb identified by "tmpdb";
Query OK, 0 rows affected (0.00 sec)
然後,使用新建立的使用者登入執行操作:
-
[[email protected] ~]# mysql -utmpdb -p'tmpdb' -h 192.168.11.212 -P 3306 -D tmpdb
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10425056
Server version: 5.0.56-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
| tmpdb |
+--------------------+
3 rows in set (0.00 sec)
mysql> show tables;
+-----------------+
| Tables_in_tmpdb |
+-----------------+
| j1_v_d |
| j1_v_i |
+-----------------+
2 rows in set (0.00 sec)
先來看看操作definer驗證方式下的檢視:
-
mysql> select * from j1_v_d;
+------+------+
| id | vl |
+------+------+
| 1 | a0 |
| 2 | bb |
+------+------+
2 rows in set (0.00 sec)
mysql> insert into j1_v_d values (3,'cc');
Query OK, 1 row affected (0.01 sec)
可以看到,查詢和更新都沒有問題,接下來再試試invoker許可權定義的檢視:
mysql> select * from j1_v_i;
- ERROR 1356 (HY000): View 'tmpdb.j1_v_i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
查詢時就報錯了,更新就更不用說了。上面的這種情況,是由於tmpdb使用者沒有操作jssdb下物件的許可權,因此讀取j1_v_i物件時就失敗了(雖然它有訪問j1_v_i物件的許可權)。
這個簡單的測試足以表明:
- definer是在定義物件是判斷是否有許可權,只要建立的使用者有許可權,那麼建立就可以成功,而且所有有許可權查詢該檢視的使用者也能夠成功執行查詢語句 - 不管是否擁有該檢視所引用物件的許可權;
- invoker是指在查詢時驗證使用者是否有許可權執行操作,當然建立時也會判斷,如果建立的使用者沒有檢視所引用表物件的訪問許可權,那建立都會失敗。
轉載:http://blog.itpub.net/7607759/viewspace-706431/