成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

創建視圖與函數,你注意過 Definer是啥意思嗎

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

[[415822]]

本文轉載自微信公眾號「MySQL技術」,作者MySQL技術。轉載本文請聯系MySQL技術公眾號。

 前言:

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

1.DEFINER簡單介紹

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

  1. CREATE 
  2.     [OR REPLACE
  3.     [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
  4.     [DEFINER = user
  5.     [SQL SECURITY { DEFINER | INVOKER }] 
  6.     VIEW view_name [(column_list)] 
  7.     AS select_statement 
  8.     [WITH [CASCADED | LOCALCHECK OPTION

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

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

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

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

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

  1. # 創建兩個視圖 定義者都是testuser 查詢的是test_tb表 
  2. mysql>  show grants for 'testuser'@'%'
  3. +------------------------------------------------------------------------------------------------------+ 
  4. | Grants for testuser@%                                                                                | 
  5. +------------------------------------------------------------------------------------------------------+ 
  6. GRANT USAGE ON *.* TO 'testuser'@'%'                                                                 | 
  7. GRANT SELECTINSERTUPDATEDELETECREATECREATE VIEW, SHOW VIEW ON `testdb`.* TO 'testuser'@'%' | 
  8. +------------------------------------------------------------------------------------------------------+ 
  9. rows in set (0.00 sec) 
  10.  
  11. mysql>  show create view view_definer\G 
  12. *************************** 1. row *************************** 
  13.                 View: view_definer 
  14.          Create ViewCREATE 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` 
  15. character_set_client: utf8mb4 
  16. collation_connection: utf8mb4_general_ci 
  17. 1 row in set (0.00 sec) 
  18.  
  19. mysql>  show create view view_invoker\G 
  20. *************************** 1. row *************************** 
  21.                 View: view_invoker 
  22.          Create ViewCREATE 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` 
  23. character_set_client: utf8mb4 
  24. collation_connection: utf8mb4_general_ci 
  25. 1 row in set (0.00 sec) 
  26.  
  27. # 只給uview用戶查詢這兩個視圖的權限 來進行查詢測試 
  28. mysql> select user(); 
  29. +-----------------+ 
  30. user()          | 
  31. +-----------------+ 
  32. | uview@localhost | 
  33. +-----------------+ 
  34. 1 row in set (0.00 sec) 
  35.  
  36. mysql> show grants; 
  37. +--------------------------------------------------------+ 
  38. | Grants for uview@%                                     | 
  39. +--------------------------------------------------------+ 
  40. GRANT USAGE ON *.* TO 'uview'@'%'                      | 
  41. GRANT SELECT ON `testdb`.`view_definer` TO 'uview'@'%' | 
  42. GRANT SELECT ON `testdb`.`view_invoker` TO 'uview'@'%' | 
  43. +--------------------------------------------------------+ 
  44. rows in set (0.00 sec) 
  45.  
  46. mysql> select * from view_definer; 
  47. +--------+----------+ 
  48. | stu_id | stu_name | 
  49. +--------+----------+ 
  50. |   1001 | from1    | 
  51. |   1002 | dfsfd    | 
  52. |   1003 | fdgfg    | 
  53. +--------+----------+ 
  54. rows in set (0.00 sec) 
  55.  
  56. mysql> select * from view_invoker; 
  57. 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 
  58.  
  59. # 結果是view_definer查詢正常,而view_invoker無法查詢 因為uview用戶不具有test_tb表的查詢權限 

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

2.一些注意事項

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

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

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

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

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

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

總結:

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

 

責任編輯:武曉燕 來源: MySQL技術
相關推薦

2020-06-20 14:09:01

信息安全數據技術

2023-10-04 17:25:01

面向接口編程

2023-12-04 07:09:53

函數遞歸python

2019-10-17 14:36:05

網絡安全信息安全Google

2012-10-08 09:19:49

2012-11-05 09:31:29

新聞回顧

2021-07-12 07:59:05

對象接口編程

2021-09-25 13:12:47

數據開發架構

2020-03-11 20:42:34

瀏覽器緩存機制

2021-01-22 07:48:07

JavaScript 高階函數閉包

2015-10-23 09:34:16

2022-04-28 08:12:29

函數調用進程切換代碼

2023-05-29 08:11:42

@Value注解Bean

2020-07-14 07:48:19

Java對象JVM

2023-03-13 13:36:00

Go擴容切片

2022-01-05 12:03:48

MySQL索引數據

2018-07-24 11:52:20

2021-09-28 20:17:30

5G公網專用

2023-08-30 07:27:39

2023-10-30 00:08:43

ERPPLM網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美二区三区 | 蜜桃综合在线 | 亚洲欧美中文日韩在线v日本 | 久久久精品 | 午夜影院普通用户体验区 | 国内精品久久久久久影视8 最新黄色在线观看 | 国产精品久久久久久久久久软件 | 欧美久久一区二区三区 | 亚洲免费在线观看 | 羞羞视频在线观看 | 7799精品视频天天看 | 欧美国产91| 国产精品久久久久久久久久软件 | 国产成人综合网 | 亚洲在线中文字幕 | 一区二区在线观看av | 亚洲一区在线日韩在线深爱 | 色偷偷噜噜噜亚洲男人 | 欧美人妇做爰xxxⅹ性高电影 | 日韩视频一区 | 日韩欧美网 | 自拍 亚洲 欧美 老师 丝袜 | 亚洲精品久久久久久久久久久久久 | 瑟瑟视频在线看 | 一区二区av在线 | 国产一级网站 | 亚洲精品久久 | 99国产视频 | 中国一级特黄真人毛片免费观看 | 亚洲精品国产成人 | 亚洲三级在线观看 | 国产精品三级 | 久久国产精品亚洲 | 九色在线视频 | 欧美日韩在线综合 | 亚洲精品一 | 国产精品99久久久久久动医院 | 久草视频观看 | 99久久精品免费 | 亚洲影音 | 午夜精品一区二区三区在线播放 |