欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL DEFINER具體使用詳解

 更新時間:2021年08月11日 09:37:10   作者:MySQL技術  
在 MySQL 數據庫中,在創(chuàng)建視圖及函數的時候,你有注意過 definer 選項嗎?本篇文章主要介紹下 MySQL 中 definer 的含義及作用,感興趣的可以了解一下

前言:

在 MySQL 數據庫中,在創(chuàng)建視圖及函數的時候,你有注意過 definer 選項嗎?在遷移視圖或函數后是否有過報錯情況,這些其實都可能和 definer 有關系。本篇文章主要介紹下 MySQL 中 definer 的含義及作用。

1.DEFINER簡單介紹

以視圖為例,我們來看下官方給出的視圖創(chuàng)建基礎語法:

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

仔細看上面語法,發(fā)現 definer 出現了兩次,一次是 DEFINER = user 一次是 SQL SECURITY 選項可以設置為 DEFINER 或 INVOKER ,看到這里,你有猜到 definer 的作用了嗎?

definer 翻譯成中文是“定義者”的意思。MySQL中,創(chuàng)建視圖(view)、函數(function)、存儲過程(procedure)、觸發(fā)器(trigger)、事件(event)時,都可以指定 DEFINER = user 選項,即指定此對象的定義者是誰,若不顯式指定,則創(chuàng)建此對象的用戶就是定義者。

對于視圖、函數及存儲過程,還可以指定 SQL SECURITY 屬性,其值可以為 DEFINER(定義者) 或 INVOKER(調用者),表示在執(zhí)行過程中,使用誰的權限來執(zhí)行。DEFINER 表示按定義者擁有的權限來執(zhí)行,INVOKER 表示用調用者的權限來執(zhí)行。

默認情況下,SQL SECURITY 屬性為 DEFINER 。其值為 DEFINER 時,數據庫中必須存在 DEFINER 指定的定義者用戶,并且該定義者用戶擁有對應的操作權限及引用的相關對象的權限,執(zhí)行者只需擁有調用權限就能成功執(zhí)行。當 SQL SECURITY 屬性為 INVOKER 時,則需要執(zhí)行者有調用權限并且有引用的相關對象的權限,才能成功執(zhí)行。

簡單來說,假設一個視圖查詢了 a b c 三張表,若此視圖的 SQL SECURITY 屬性為 DEFINER ,當使用用戶 u 查詢此視圖時,用戶 u 只需此視圖的查詢權限即可;若此視圖的 SQL SECURITY 屬性為 INVOKER ,則用戶 u 需要有此視圖的查詢權限且有 a b c 三張表的查詢權限。下面通過示例來具體演示下:

# 創(chuàng)建兩個視圖 定義者都是testuser 查詢的是test_tb表
mysql>  show grants for 'testuser'@'%';
+------------------------------------------------------------------------------------------------------+
| Grants for testuser@%                                                                                |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%'                                                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE VIEW, SHOW VIEW ON `testdb`.* TO 'testuser'@'%' |
+------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql>  show create view view_definer\G
*************************** 1. row ***************************
                View: view_definer
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY DEFINER VIEW `view_definer` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb`
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
1 row in set (0.00 sec)

mysql>  show create view view_invoker\G
*************************** 1. row ***************************
                View: view_invoker
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY INVOKER VIEW `view_invoker` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb`
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
1 row in set (0.00 sec)

# 只給uview用戶查詢這兩個視圖的權限 來進行查詢測試
mysql> select user();
+-----------------+
| user()          |
+-----------------+
| uview@localhost |
+-----------------+
1 row in set (0.00 sec)

mysql> show grants;
+--------------------------------------------------------+
| Grants for uview@%                                     |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'uview'@'%'                      |
| GRANT SELECT ON `testdb`.`view_definer` TO 'uview'@'%' |
| GRANT SELECT ON `testdb`.`view_invoker` TO 'uview'@'%' |
+--------------------------------------------------------+
3 rows in set (0.00 sec)

mysql> select * from view_definer;
+--------+----------+
| stu_id | stu_name |
+--------+----------+
|   1001 | from1    |
|   1002 | dfsfd    |
|   1003 | fdgfg    |
+--------+----------+
9 rows in set (0.00 sec)

mysql> select * from view_invoker;
ERROR 1356 (HY000): View 'testdb.view_invoker' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

# 結果是view_definer查詢正常,而view_invoker無法查詢 因為uview用戶不具有test_tb表的查詢權限

自定義函數及存儲過程也是類似,若 SQL SECURITY 屬性為 INVOKER ,同樣需要調用者有執(zhí)行權限并且有引用的相關對象的權限,才能成功執(zhí)行。

2.一些注意事項

額外補充點知識,只有擁有創(chuàng)建權限且有 SUPER 權限的用戶才可以建 DEFINER = 其他用戶的對象。例如:root 賬號可以創(chuàng)建 DEFINER = testuser 的視圖,而 testuser 在有創(chuàng)建視圖的前提下只能創(chuàng)建 DEFINER 為自己的視圖。

為了更細致的了解 DEFINER 相關作用,以視圖為例再來說幾個特殊情況下的示例:

假設用戶 u1 不存在,使用 root 賬號可以創(chuàng)建 DEFINER = u1 的視圖,若該視圖的 SQL SECURITY 屬性為 DEFINER ,則查詢時會報用戶不存在的錯誤,若該視圖的 SQL SECURITY 屬性為 INVOKER ,則使用 root 賬號可正常查詢該視圖。

假設用戶 u2 存在但不具有查詢表 a 的權限,使用 root 賬號可以創(chuàng)建 DEFINER = u2 的視圖來查詢表 a ,若該視圖的 SQL SECURITY 屬性為 DEFINER ,則查詢時報缺少權限的錯誤,若該視圖的 SQL SECURITY 屬性為 INVOKER ,則使用 root 賬號可正常查詢該視圖。當使用用戶 u2 登錄時,則創(chuàng)建視圖來查詢表 a 會直接報錯缺少權限,即創(chuàng)建不了查詢表 a 的視圖,無論此視圖的 SQL SECURITY 屬性是什么。

看完上述示例后,不清楚你對 DEFINER 是否有了更清晰的認識,有興趣的同學可以自己測試看一看。結合筆者日常經驗,說下 DEFINER 相關注意事項吧:

  • SQL SECURITY 屬性建議使用默認的 DEFINER 。
  • 某個庫內的視圖、函數、存儲過程建議使用統(tǒng)一的 DEFINER 用戶。
  • 不要輕易修改及刪除數據庫用戶,因為此用戶可能是相關對象的定義者。
  • 若要修改 SQL SECURITY 屬性,請做好測試,清楚修改前后的區(qū)別。
  • 數據庫遷移時,要注意新環(huán)境存在相關對象的定義者用戶。
  • 做數據庫遷移時,建議首先在新環(huán)境創(chuàng)建相關用戶及賦予權限。

總結:

本篇文章主要介紹了 DEFINER 相關知識,這些主要在創(chuàng)建視圖、函數、存儲過程等對象時會遇到,平時比較容易被忽略。但這些細節(jié)還是應該注意的,多了解多學習下,這樣到真正用到的時候可以避免很多錯誤。

到此這篇關于MySQL DEFINER具體使用詳解的文章就介紹到這了,更多相關MySQL DEFINER內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決mysql問題:由于找不到MSVCR120.dll,無法繼續(xù)執(zhí)行代碼

    解決mysql問題:由于找不到MSVCR120.dll,無法繼續(xù)執(zhí)行代碼

    這篇文章給大家分享解決mysql問題:由于找不到MSVCR120.dll,無法繼續(xù)執(zhí)行代碼.通過重新安裝程序解決此問題,下面小編把問題記錄及解決過程分享給大家,需要的朋友參考下吧
    2021-06-06
  • Mysql存儲二進制對象數據問題

    Mysql存儲二進制對象數據問題

    這篇文章主要介紹了Mysql存儲二進制對象數據問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 一篇文章帶你了解MySQL數據庫約束

    一篇文章帶你了解MySQL數據庫約束

    數據庫中要管理很多數據,但是這些數據是否正確、是否非法,光靠人力來檢驗是遠遠不夠的,因此我們想讓數據庫擁有豐富的檢驗和校驗能力,所以便引入了約束,下面這篇文章主要給大家介紹了關于MySQL數據庫約束的相關資料,需要的朋友可以參考下
    2023-06-06
  • 詳解MySQL中事務的持久性實現原理

    詳解MySQL中事務的持久性實現原理

    這篇文章主要介紹了詳解MySQL中事務的持久性實現原理,幫助大家更好的理解和使用MySQL數據庫,感興趣的朋友可以了解下
    2021-01-01
  • mysql數據庫優(yōu)化總結(心得)

    mysql數據庫優(yōu)化總結(心得)

    本篇文章是對mysql數據庫優(yōu)化進行了詳細的總結與介紹,需要的朋友參考下
    2013-06-06
  • 阿里云Linux CentOS 7.2下自建MySQL的root密碼忘記的解決方法

    阿里云Linux CentOS 7.2下自建MySQL的root密碼忘記的解決方法

    這篇文章主要介紹了阿里云Linux CentOS 7.2下自建MySQL的root密碼忘記的解決方法,需要的朋友可以參考下
    2017-07-07
  • MySQL sysdate()函數的具體使用

    MySQL sysdate()函數的具體使用

    本文主要介紹了MySQL sysdate()函數的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • MySQL執(zhí)行狀態(tài)的查看與分析

    MySQL執(zhí)行狀態(tài)的查看與分析

    今天小編就為大家分享一篇關于MySQL執(zhí)行狀態(tài)的查看與分析,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Mysql匿名登錄無法創(chuàng)建數據庫問題解決方案

    Mysql匿名登錄無法創(chuàng)建數據庫問題解決方案

    這篇文章主要介紹了Mysql匿名登錄無法創(chuàng)建數據庫問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • MySQL?優(yōu)化?index?merge引起的死鎖分析

    MySQL?優(yōu)化?index?merge引起的死鎖分析

    這篇文章主要介紹了MySQL?優(yōu)化?index?merge引起的死鎖分析,MySQL通過優(yōu)化索引合并是遇到的死鎖問題,下面具體分析需要的小伙伴可以參考一下
    2022-04-04

最新評論