全面學習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)然後,使用新建立的使用者登入執行操作:
[root@test ~]# 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是指在查詢時驗證使用者是否有許可權執行操作,當然建立時也會判斷,如果建立的使用者沒有檢視所引用表物件的訪問許可權,那建立都會失敗。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2128397/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 全面學習MySQL中的檢視(3) 指定檢視處理方式MySql
- 全面學習MySQL中的檢視(2) 指定檢視建立者MySql
- MySQL之檢視學習MySql
- MySQL全面瓦解15:檢視MySql
- mysql檢視學習總結MySql
- (8)mysql 中的檢視MySql
- odoo檢視入門學習- tree檢視的使用Odoo
- 使用nslookup檢視SSL安全證書域名驗證資訊
- Mysql 檢視埠號的幾種方式MySql
- Mysql檢視埠號的幾種方式MySql
- MySQL資料庫檢視:檢視定義、建立檢視、修改檢視MySql資料庫
- 管理mysql的檢視MySql
- MYSQL 檢視MySql
- Mysql檢視:MySql
- MySQL檢視版本號的五種方式介紹MySql
- 學習筆記 檢視筆記
- 物化檢視-學習篇
- ASP.NET Core 5.0 MVC中的檢視分類——佈局檢視、啟動檢視、具體檢視、分部檢視ASP.NETMVC
- Echarts檢視視覺化-學習筆記(努力更新中)Echarts視覺化筆記
- IOS 學習筆記(1) 檢視UIViewControlleriOS筆記UIViewController
- MySQL 建立檢視MySql
- Mysql檢視程式MySql
- Mysql版本檢視MySql
- mysql 檢視索引MySql索引
- MySQL View 檢視MySqlView
- Django - 檢視層 - 檢視函式及快捷方式Django函式
- 檢視並ORACLE的編碼方式Oracle
- 物化檢視學習筆記筆記
- 檢視MySQL鎖等待的原因MySql
- mysql檢視錶建立的索引MySql索引
- 方便自我學習的檢視:dict_columns !
- MySQL 查詢的成本的檢視MySql
- angular學習筆記(三)-檢視繫結資料的兩種方式Angular筆記
- 在rhel4中檢視mysql的版本MySql
- 檢視oracle啟動方式Oracle
- Flutter學習之檢視體系Flutter
- oracle學習筆記——檢視、索引Oracle筆記索引
- MySQL檢視介紹MySql