全面學習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之檢視學習MySql
- MySQL全面瓦解15:檢視MySql
- odoo檢視入門學習- tree檢視的使用Odoo
- 使用nslookup檢視SSL安全證書域名驗證資訊
- 管理mysql的檢視MySql
- 11 UML中的邏輯檢視、程序檢視、實現檢視、部署檢視
- MySQL檢視版本號的五種方式介紹MySql
- MYSQL 檢視MySql
- ASP.NET Core 5.0 MVC中的檢視分類——佈局檢視、啟動檢視、具體檢視、分部檢視ASP.NETMVC
- MySQL View 檢視MySqlView
- 檢視MySQL鎖等待的原因MySql
- MySQL 查詢的成本的檢視MySql
- Django - 檢視層 - 檢視函式及快捷方式Django函式
- Echarts檢視視覺化-學習筆記(努力更新中)Echarts視覺化筆記
- 11、Oracle中的檢視Oracle
- 檢視mysql版本的六種方法MySql
- MySQL檢視介紹MySql
- MySQL 檢視簡介MySql
- 10_MySQL檢視MySql
- Flutter學習之檢視體系Flutter
- ClickHouse 物化檢視學習總結
- linux:檢視使用中的埠Linux
- 聊一聊 React 中更新 ui 檢視的幾種方式ReactUI
- 怎麼檢視mysql的儲存引擎MySql儲存引擎
- Oracle普通檢視和物化檢視的區別Oracle
- MySQL入門系列:檢視MySql
- mysql建立索引和檢視MySql索引
- MySql 什麼是檢視MySql
- MySQL筆記 13 檢視MySql筆記
- 【MySQL】檢視&子查詢MySql
- Linux 安全資訊檢視Linux
- [Django REST framework - 檢視元件之檢視基類、檢視擴充套件類、檢視子類、檢視集]DjangoRESTFramework元件套件
- 如何檢視SSL證書的相容性
- 【學習】SQL基礎-015-檢視SQL
- django 的類檢視和函式檢視-雜談Django函式
- hive中的 lateral view(側檢視)HiveView
- vue中動態修改陣列的展現(資料更新,檢視不更新驗證)Vue陣列
- 檢視mysql 的binlog日誌存放的位置(轉)MySql
- 【AWR】DBA_HIST檢視檢視儲存在AWR中的歷史資料