全面學習MySQL中的檢視(2) 指定檢視建立者
1.2 指定檢視建立者
我們知道MySQL資料庫其實並不看重物件的屬主,起碼與ORACLE中schema(user)的定義完全不同,比如說MySQL中的表物件是屬於資料庫,而不管是誰建立的,這其實就沒有了所屬使用者的概念。不過,檢視是一個例外,檢視中不僅包含著建立使用者的資訊,而且這些資訊甚至還決定,這些檢視是否能夠成功的建立。
操作前繼續給tmpdb使用者授權(以root使用者執行下列語句):
mysql> grant create,alter,drop,create view,show view on tmpdb.* to tmpdb;
Query OK, 0 rows affected (0.00 sec)建立檢視,指定建立者為 tmpdb:
mysql> create definer=tmpdb view tmpdb.j2_v_t as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)建立另一個檢視,指定建立者為當前使用者,即root:
mysql> create definer=current_user view tmpdb.j2_v_c as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)
以下操作如非特別說明,均為tmpdb使用者身份執行。
建立一個新表:
mysql> create table j2 (id int);
Query OK, 0 rows affected (0.02 sec)
而後,通過tmpdb使用者檢視上面的幾個檢視,先看看基礎current_user的檢視:
mysql> show create view j2_v_c;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| View | Create View |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| j2_v_c | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `tmpdb`.`j2_v_c` AS select `jssdb`.`j1`.`id` AS `id`,`jssdb`.`j1`.`vl` AS `vl` from `jssdb`.`j1` |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
再檢視基於指定使用者的檢視:
mysql> show create view j2_v_t;
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| View | Create View |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| j2_v_t | CREATE ALGORITHM=UNDEFINED DEFINER=`tmpdb`@`%` SQL SECURITY DEFINER VIEW `tmpdb`.`j2_v_t` AS select `jssdb`.`j1`.`id` AS `id`,`jssdb`.`j1`.`vl` AS `vl` from `jssdb`.`j1` |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+--------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1356 | View 'tmpdb.j2_v_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them |
+---------+------+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)雖說擁有show view許可權,因此可以直接檢視建立的檢視,但是在檢視指定使用者檢視時顯示,由於許可權的原因,tmpdb.j2_v_t實際是不可用的,也就是說,當指定使用者時,指定的使用者必須要擁有檢視所引用的物件的許可權,否則即使建立成功,使用時卻會出現錯誤。
要命處恰在於此,建立時沒有異常,真正應用時問題才會暴露,這就要求DBA在建立這類檢視時必須特別謹慎。
接下來再嘗試修改,看看會是什麼情況:
首先來看看指定使用者是什麼情況呢:
mysql> alter view j2_v_t as select * from tmpdb.j2;
Query OK, 0 rows affected (0.00 sec)順利修改,那麼對於root使用者建立的檢視又會是什麼情況呢:
mysql> alter view j2_v_c as select * from tmpdb.j2;
ERROR 1227 (42000): Access denied; you need the SUPER privilege for this operation修改root使用者建立的檢視時提示許可權不足,即使修改的使用者已經擁有了tmpdb下的alter/create等許可權。從引自看,檢視物件又與建立的使用者有所關聯了。
如果的心探究的話,直接到作業系統中檢視檢視物件的檔案,會生現它只有一個結構檔案.frm:
[root@test tmpdb]# more j2_v_c.frm
TYPE=VIEW
query=select `jssdb`.`j1`.`id` AS `id`,`jssdb`.`j1`.`vl` AS `vl` from `jssdb`.`j1`
md5=1e3aea62295d05dfb4f7eb3c98859878
updatable=1
algorithm=0
definer_user=root
definer_host=localhost
suid=2
with_check_option=0
revision=1
timestamp=2011-09-07 16:31:14
create-version=1
source=select * from jssdb.j1這也說明檢視雖然只有定義沒有實體(也說明檢視不允許有索引等關聯物件),但仍然與建立使用者有一定聯絡,實際應用時,對於這點也需要注意。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-706845/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL之檢視學習MySql
- MySQL全面瓦解15:檢視MySql
- mysql建立索引和檢視MySql索引
- mysql binlog檢視指定資料庫MySql資料庫
- odoo檢視入門學習- tree檢視的使用Odoo
- MYSQL 檢視MySql
- 11 UML中的邏輯檢視、程序檢視、實現檢視、部署檢視
- 管理mysql的檢視MySql
- SQL Server建立使用者只能訪問指定資料庫和檢視SQLServer資料庫
- MySQL View 檢視MySqlView
- Echarts檢視視覺化-學習筆記(努力更新中)Echarts視覺化筆記
- Git檢視指定commit資訊GitMIT
- ASP.NET Core 5.0 MVC中的檢視分類——佈局檢視、啟動檢視、具體檢視、分部檢視ASP.NETMVC
- [20240911]檢視超長檢視的定義2.txt
- MySQL 檢視簡介MySql
- MySQL檢視介紹MySql
- 10_MySQL檢視MySql
- Laravel 通過遷移指令碼建立MySQL檢視Laravel指令碼MySql
- Laravel 透過遷移指令碼建立MySQL檢視Laravel指令碼MySql
- iOS 實現檢視指定圓角iOS
- 檢視MySQL鎖等待的原因MySql
- Microsoft Excel 教程「2」,如何在 Excel 中建立資料透檢視?ROSExcel
- ClickHouse 物化檢視學習總結
- Flutter學習之檢視體系Flutter
- yii2檢視
- 檢視Ubuntu上佔用指定埠的程序Ubuntu
- git檢視指定提交檔案的內容Git
- MySQL 查詢的成本的檢視MySql
- MySql 什麼是檢視MySql
- 【MySQL】檢視&子查詢MySql
- MySQL筆記 13 檢視MySql筆記
- MySQL入門系列:檢視MySql
- 使用Excel的2個檢視Excel
- Mac小技巧 快速檢視指定應用程式的所有視窗Mac
- Git檢視分支建立時間Git
- 在django中怎麼檢視建立的資料表Django
- 11、Oracle中的檢視Oracle
- [Django REST framework - 檢視元件之檢視基類、檢視擴充套件類、檢視子類、檢視集]DjangoRESTFramework元件套件
- 檢視oracle資料庫的連線數以及使用者檢視Oracle資料庫