成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

MySQL DEFINER具體使用詳解

瀏覽:96日期:2023-10-17 18:47:38
目錄前言:1.DEFINER簡單介紹2.一些注意事項總結:前言:

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

1.DEFINER簡單介紹

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

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]

仔細看上面語法,發現 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 三張表的查詢權限。下面通過示例來具體演示下:

# 創建兩個視圖 定義者都是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_definerG*************************** 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: utf8mb4collation_connection: utf8mb4_general_ci1 row in set (0.00 sec)mysql> show create view view_invokerG*************************** 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: utf8mb4collation_connection: utf8mb4_general_ci1 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 ,同樣需要調用者有執行權限并且有引用的相關對象的權限,才能成功執行。

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 DEFINER具體使用詳解的文章就介紹到這了,更多相關MySQL DEFINER內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩午夜| 国产精品久久久久久久久久直播 | 欧美va亚洲va在线观看蝴蝶网| 亚洲午夜在线视频| 岛国一区二区在线观看| 欧美日韩高清在线播放| 免费av成人在线| 色哟哟一区二区在线观看| 亚洲一区二区三区四区不卡| 伊人精品视频| 亚洲国产精品一区制服丝袜 | 欧美日本视频在线| 日韩电影一区二区三区| 校园激情久久| 亚洲国产视频在线| 国产视频久久| 亚洲一卡二卡三卡四卡| 香蕉久久夜色| 五月激情综合色| 午夜亚洲伦理| 日韩国产欧美三级| 日本久久一区二区三区| 三级影片在线观看欧美日韩一区二区| 日韩一级精品| 亚洲综合视频网| 性高湖久久久久久久久| 午夜精品一区二区三区电影天堂| 在线综合亚洲| 亚洲六月丁香色婷婷综合久久 | 免费一级欧美片在线播放| 一区二区三区欧美激情| 国产一区二区三区四区三区四| 国产人成一区二区三区影院| 午夜国产一区| 亚洲黄色片在线观看| 色偷偷一区二区三区| 激情国产一区二区| 日韩欧美国产麻豆| 97精品国产露脸对白| 欧美激情中文字幕一区二区| 99精品视频中文字幕| 久久色视频免费观看| bt欧美亚洲午夜电影天堂| 日韩亚洲欧美一区二区三区| 国产精品69毛片高清亚洲| 欧美日韩一区不卡| 国产经典欧美精品| 欧美一级国产精品| 成人小视频在线| 337p粉嫩大胆色噜噜噜噜亚洲| 成人免费高清在线| 精品88久久久久88久久久| 欧美日韩理论| 亚洲日本欧美天堂| 国产一级精品aaaaa看| 日韩主播视频在线| 欧美色电影在线| 粉嫩绯色av一区二区在线观看| 久久一区二区三区四区| 亚洲性视频h| 天堂蜜桃一区二区三区| 日韩一卡二卡三卡国产欧美| 欧美在线亚洲综合一区| 亚洲另类春色国产| 色欧美日韩亚洲| 国产激情视频一区二区在线观看| 精品黑人一区二区三区久久| 国内激情久久| 亚洲国产成人av好男人在线观看| 在线观看日韩国产| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 欧美aaaaa成人免费观看视频| 911精品产国品一二三产区| 91在线精品一区二区三区| 17c精品麻豆一区二区免费| 亚洲欧美日韩另类精品一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 精品国产一区二区三区久久影院| 欧美网站在线| 亚洲国产精品久久久久婷婷884| 8v天堂国产在线一区二区| 欧美在线视频一区二区三区| 亚洲制服丝袜av| 91精品麻豆日日躁夜夜躁| 欧美激情视频一区二区三区免费| 亚洲国产精品一区二区久久恐怖片| 9191精品国产综合久久久久久| 99久久99久久久精品齐齐| 亚洲日本va在线观看| 欧美另类高清zo欧美| 国产精品av久久久久久麻豆网| 亚洲国产日韩a在线播放性色| 日韩视频一区在线观看| 亚洲激情网站| 国产精品一级在线| 亚洲视频香蕉人妖| 日韩一区二区三区四区| 国产一区二区高清| 成人免费高清在线观看| 亚洲欧美激情小说另类| 欧美理论片在线| 亚洲国产二区| 国产精品一品视频| 一区二区三区在线免费视频| 欧美视频三区在线播放| 国产精品v欧美精品v日韩精品| 免费不卡在线视频| 国产精品美女久久久久aⅴ | 国产精品中文有码| 一区二区欧美在线观看| 亚洲精品一区二区三区影院| 国产模特精品视频久久久久| 成人一区二区三区在线观看 | 亚洲视频小说图片| 精品日韩99亚洲| 一本色道综合亚洲| 女主播福利一区| 国内精品伊人久久久久av影院| 最新日韩在线视频| 91精品国产美女浴室洗澡无遮挡| 国产一区成人| 国产精品v亚洲精品v日韩精品 | 成人av免费在线播放| 亚洲二区在线视频| 久久久精品免费观看| 日本丶国产丶欧美色综合| 欧美精品一卡| 国产xxx精品视频大全| 亚洲va在线va天堂| 国产精品久久久久精k8| 精品国产一区久久| 91福利精品视频| 国产日产精品一区二区三区四区的观看方式| 成人av资源在线| 美女mm1313爽爽久久久蜜臀| 一区二区在线观看免费| 亚洲国产精品国自产拍av| 日韩午夜在线观看| 91久久精品日日躁夜夜躁欧美| 激情欧美国产欧美| 99久久国产综合色|国产精品| 久久97超碰色| 亚洲成a人v欧美综合天堂下载| 亚洲欧美偷拍三级| 国产三区在线成人av| 欧美一区二区三区的| 狂野欧美一区| 亚洲深夜激情| 一色屋精品视频在线看| av亚洲精华国产精华| 韩国理伦片一区二区三区在线播放 | 国产精品国产精品国产专区不蜜| 日韩精品一区二区三区swag| 欧美日韩一区二区三区不卡| 色综合 综合色| 亚洲日本无吗高清不卡| 国产精品xvideos88| 色综合欧美在线| 成人免费黄色大片| 国产在线精品一区在线观看麻豆| 视频一区在线播放| 亚洲综合清纯丝袜自拍| 国产精品久久久久aaaa樱花| 久久夜色精品一区| 日韩欧美激情四射| 6080午夜不卡| 欧美一区二区三区视频| 欧美一区二区网站| 欧美日韩情趣电影| 欧美三级视频在线观看| 欧美三片在线视频观看 | 一区二区在线观看av| 亚洲啪啪综合av一区二区三区| 久久免费看少妇高潮| 精品国产麻豆免费人成网站| 精品精品国产高清a毛片牛牛| 日韩欧美在线观看一区二区三区| 777色狠狠一区二区三区| 91精品国产黑色紧身裤美女| 欧美精品三级日韩久久| 9191久久久久久久久久久| 91麻豆精品国产91久久久久久久久| 欧美日韩一区久久| 这里只有精品视频在线观看| 欧美高清www午色夜在线视频| 正在播放一区二区| 欧美成人艳星乳罩| 国产视频一区二区在线| 国产日韩精品一区二区浪潮av| 国产拍欧美日韩视频二区| 国产欧美日产一区| 亚洲人成精品久久久久| 亚洲无人区一区| 日韩国产欧美视频| 国内一区二区视频| 成人午夜免费视频| 牛夜精品久久久久久久99黑人| 女女同性精品视频| 亚洲无吗在线| 欧美亚洲网站|