日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

说说MySQL权限

發(fā)布時(shí)間:2024/4/14 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 说说MySQL权限 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文首發(fā)于個(gè)人微信公眾號《andyqian》,期待你的關(guān)注~

前言

??今天繼續(xù)MySQL系列文章,講講MySQL權(quán)限相關(guān)的內(nèi)容。我們都知道,在寫系統(tǒng)的時(shí)候,都會有權(quán)限相關(guān)的服務(wù),以達(dá)到權(quán)限控制的目的。以最簡單的權(quán)限菜單為例: 管理員擁有最大權(quán)限,可以查看系統(tǒng)下所有菜單。操作員只擁有部分菜單權(quán)限。同樣的,在MySQL數(shù)據(jù)庫中也有相應(yīng)的權(quán)限管理。例如:數(shù)據(jù)庫連接權(quán)限,新增,修改,查詢權(quán)限等等。下面我們就一一揭曉MySQL權(quán)限的真實(shí)面貌。

授權(quán)方式

??在講 MySQL 權(quán)限之前,我們不得不先熟悉下MySQL中常見的兩種授權(quán)方式。

姑且稱為:授權(quán)法改表法 吧。

1. 授權(quán)法

標(biāo)準(zhǔn)語法如下:

grant all on db_name.table_name to 'user_name'@'host_name';

其中:

  • grant 為MySQL關(guān)鍵字。
  • all 表示所有權(quán)限,也可以授予部分權(quán)限,如select,insert,update,create,drop等等。
  • db_name 表示數(shù)據(jù)庫名。其中:* 表示該數(shù)據(jù)庫實(shí)例中的所有數(shù)據(jù)庫。
  • table_name 為db_name數(shù)據(jù)庫中的表名。其中:* 表示db_name數(shù)據(jù)庫中的所有表。
  • user_name 表示數(shù)據(jù)庫服務(wù)器中已經(jīng)存在的用戶名。
  • host_name 表示允許連接的主機(jī)。(localhost / 127.0.0.1 表示本機(jī),% 表示任何主機(jī),也可以用域名表示。)
  • 以設(shè)置root用戶允許遠(yuǎn)程連接為例:

    給 root 用戶設(shè)置該實(shí)例上所有數(shù)據(jù)庫的所有權(quán)限,且允許其通過任意主機(jī)連接該實(shí)例。則可以用下述語句表示:

    grant all on *.* to 'root'@'%';

    2. 改表法

    你一定很好奇,MySQL是如何判斷用戶是否有某數(shù)據(jù)庫的權(quán)限?是否有某表的權(quán)限?
    其實(shí)呀,在MySQL中是有特定數(shù)據(jù)結(jié)構(gòu)來存儲這部分信息的。我們可以按照下述步驟來找到它,甚至可以來修改它,以達(dá)到修改權(quán)限的目的。

  • 首先,我們登錄到MySQL服務(wù)器。
  • 進(jìn)入MySQL服務(wù)器中自帶的 mysql 數(shù)據(jù)庫中。
  • 找到 mysql 數(shù)據(jù)中的 user 表,修改對應(yīng)用戶的信息即可。
  • 以設(shè)置root用戶允許遠(yuǎn)程連接為例:

    use mysql;update user set host="%" where user="root";flush privileges;

    執(zhí)行以上語句后,我們可以通過以下語檢查是否生效:

    show grants for 'root'@'%';

    值得注意的是:

    為了權(quán)限驗(yàn)證時(shí)的高效性。MySQL在服務(wù)啟動時(shí),就會將權(quán)限數(shù)據(jù)加載在內(nèi)存中。因此,授權(quán)法改表法 會有以下細(xì)微差異:

  • 我們在使用 grant 命令時(shí),即授權(quán)法。其會自動通知MySQL服務(wù)器重新加載一次權(quán)限數(shù)據(jù)。以達(dá)到即時(shí)生效的效果。
  • 但當(dāng)我們使用改表法時(shí)。是沒有通知重新加載權(quán)限數(shù)據(jù)的。因此會導(dǎo)致其不會即時(shí)生效。直至服務(wù)重啟后生效。服務(wù)重啟,特別是生產(chǎn)環(huán)境,那幾乎是災(zāi)難性的。好在MySQL為我們提供了手動通知的命令。即:flush privilege命令。
  • 例如:

    mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)

    連接權(quán)限

    ?? 通過上面的介紹,我們現(xiàn)在應(yīng)該已經(jīng)知道了MySQL中常見的授權(quán)方式。現(xiàn)在就從實(shí)際角度來用用。我們都知道在MySQL中默認(rèn)是不允許root用戶遠(yuǎn)程登錄的。我們通過以下命令修改即可:

    grant all on *.* to 'root'@'%';
  • 如果想設(shè)置成通過指定的IP登錄,則可以將 %替換成特定的IP即可。
  • 如果想設(shè)置成通過指定的IP段登錄,即可以將%替換成192.168.1.%即可。
  • ??(其中: 將192.168.1修改成你想要IP段即可!)

    表權(quán)限

    ??知道了連接權(quán)限,我們再來說說表權(quán)限。以幾種常見的場景為例:

  • 設(shè)置用戶 andyqian 在 customer 數(shù)據(jù)庫中的 t_user 表的所有權(quán)限。
  • grant all on customer.t_user to 'andyqian'@'%';
  • 設(shè)置用戶 andyqian 在 customer 數(shù)據(jù)庫中 t_user 表的只讀權(quán)限。
  • grant select on customer.t_user to 'andyqian'@'%';

    當(dāng)僅僅只設(shè)置只讀權(quán)限時(shí),執(zhí)行update命令會有如下錯(cuò)誤信息:

    mysql> update t_user set name="sansan",updated_at=now() where oid=1; ERROR 1142 (42000): UPDATE command denied to user 'andyqian'@'localhost' for table 't_user
  • 設(shè)置用戶andyqian在 customer 數(shù)據(jù)庫中 t_user 表的可讀可寫權(quán)限。
  • grant select,insert,update on customer.t_user to 'andyqian'@'%';

    當(dāng)僅僅只設(shè)置可讀,可寫,可修改權(quán)限時(shí),執(zhí)行drop命令會有如下錯(cuò)誤信息:

    mysql> drop table t_user; ERROR 1142 (42000): DROP command denied to user 'andyqian'@'%' for table 't_user

    列權(quán)限

    ??在某些場景下,我們需要將權(quán)限精確到列上。我們也可以使用 grant命令來實(shí)現(xiàn)。

  • 設(shè)置指定列的insert權(quán)限時(shí):
  • grant insert(created_at,updated_at) on customer.t_user to 'andyqian'@'localhost';
  • insert包括未設(shè)置權(quán)限的列時(shí),則會有以下錯(cuò)誤信息:
  • mysql> insert into t_user(name,created_at,updated_at)values('name',now(),now()); ERROR 1143 (42000): INSERT command denied to user 'andyqian'@'localhost' for column 'name' in table 't_user'

    撤銷權(quán)限

    ??有添加權(quán)限,肯定也少不了撤銷權(quán)限。其語法與grant基本一致。僅僅只是關(guān)鍵字不同

  • 撤銷 用戶 andyqian 對 customer數(shù)據(jù)庫中的t_user表 created_at和updated_at字段的新增權(quán)限。
  • revoke insert(created_at,updated_at) on customer.t_user from 'andyqian'@'localhost';

    查看用戶權(quán)限

    ??上面說到,如果用戶執(zhí)行沒有權(quán)限的命令時(shí)。則會顯示錯(cuò)誤信息。為了避免這種情況發(fā)生。我們可以先通過以下命令來查看當(dāng)前用戶擁有的權(quán)限。

    命令: show grants for 'user_name'@'localhost'

    其可以使用current_user()函數(shù)來表示當(dāng)前登錄用戶。

    例如:

    mysql> show grants for current_user(); +-----------------------------------------------------------------------+ | Grants for andyqian@localhost | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'andyqian'@'localhost' | | GRANT SELECT, INSERT ON `customer`.`t_user` TO 'andyqian'@'localhost' | +-----------------------------------------------------------------------+ 2 rows in set (0.00 sec)
  • 其中第一句: USAGE 表示沒有特殊權(quán)限的意思。使用 show grants命令查看時(shí),通常會一起顯示在結(jié)果列表中。
  • 第二句則表示用戶 andyqian 在customer數(shù)據(jù)庫中的t_user表中有select,insert 權(quán)限。
  • 最后

    ??有很多童鞋會覺得:數(shù)據(jù)庫管理,SQL優(yōu)化,索引建立等等,都是DBA的事情。開發(fā)人員不需要了解。我認(rèn)為這種認(rèn)知是錯(cuò)誤的,數(shù)據(jù)庫設(shè)計(jì)本身就是后端工程師工作職責(zé)的一部分。DBA 應(yīng)該是設(shè)計(jì)的審核者,而不是建立者。


    相關(guān)閱讀:

    寫會MySQL索引

    讀懂MySQL執(zhí)行計(jì)劃

    <center></center>

    總結(jié)

    以上是生活随笔為你收集整理的说说MySQL权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。