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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

说说mysql_说说MySQL权限 - andyqian的个人空间 - OSCHINA - 中文开源技术交流社区

發布時間:2023/12/10 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 说说mysql_说说MySQL权限 - andyqian的个人空间 - OSCHINA - 中文开源技术交流社区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文首發于個人微信公眾號《andyqian》,期待你的關注~

前言

今天繼續MySQL系列文章,講講MySQL權限相關的內容。我們都知道,在寫系統的時候,都會有權限相關的服務,以達到權限控制的目的。以最簡單的權限菜單為例: 管理員擁有最大權限,可以查看系統下所有菜單。操作員只擁有部分菜單權限。同樣的,在MySQL數據庫中也有相應的權限管理。例如:數據庫連接權限,新增,修改,查詢權限等等。下面我們就一一揭曉MySQL權限的真實面貌。

授權方式

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

姑且稱為:授權法?和?改表法?吧。

1. 授權法

標準語法如下:

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

其中:

grant 為MySQL關鍵字。

all 表示所有權限,也可以授予部分權限,如select,insert,update,create,drop等等。

db_name 表示數據庫名。其中:* 表示該數據庫實例中的所有數據庫。

table_name 為db_name數據庫中的表名。其中:* 表示db_name數據庫中的所有表。

user_name 表示數據庫服務器中已經存在的用戶名。

host_name 表示允許連接的主機。(localhost / 127.0.0.1 表示本機,% 表示任何主機,也可以用域名表示。)

以設置root用戶允許遠程連接為例:

給 root 用戶設置該實例上所有數據庫的所有權限,且允許其通過任意主機連接該實例。則可以用下述語句表示:

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

2. 改表法

你一定很好奇,MySQL是如何判斷用戶是否有某數據庫的權限?是否有某表的權限?

其實呀,在MySQL中是有特定數據結構來存儲這部分信息的。我們可以按照下述步驟來找到它,甚至可以來修改它,以達到修改權限的目的。

首先,我們登錄到MySQL服務器。

進入MySQL服務器中自帶的 mysql 數據庫中。

找到 mysql 數據中的 user 表,修改對應用戶的信息即可。

以設置root用戶允許遠程連接為例:

use mysql;

update user set host="%" where user="root";

flush privileges;

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

show grants for 'root'@'%';

值得注意的是:

為了權限驗證時的高效性。MySQL在服務啟動時,就會將權限數據加載在內存中。因此,授權法?與?改表法?會有以下細微差異:

我們在使用 grant 命令時,即授權法。其會自動通知MySQL服務器重新加載一次權限數據。以達到即時生效的效果。

但當我們使用改表法時。是沒有通知重新加載權限數據的。因此會導致其不會即時生效。直至服務重啟后生效。服務重啟,特別是生產環境,那幾乎是災難性的。好在MySQL為我們提供了手動通知的命令。即:flush privilege命令。

例如:

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

連接權限

通過上面的介紹,我們現在應該已經知道了MySQL中常見的授權方式。現在就從實際角度來用用。我們都知道在MySQL中默認是不允許root用戶遠程登錄的。我們通過以下命令修改即可:

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

如果想設置成通過指定的IP登錄,則可以將?%替換成特定的IP即可。

如果想設置成通過指定的IP段登錄,即可以將%替換成192.168.1.%即可。

(其中: 將192.168.1修改成你想要IP段即可!)

表權限

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

設置用戶 andyqian 在 customer 數據庫中的 t_user 表的所有權限。 grant all on customer.t_user to 'andyqian'@'%';

設置用戶 andyqian 在 customer 數據庫中 t_user 表的只讀權限。 grant select on customer.t_user to 'andyqian'@'%';

當僅僅只設置只讀權限時,執行update命令會有如下錯誤信息: 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

設置用戶andyqian在?customer?數據庫中?t_user?表的可讀可寫權限。 grant select,insert,update on customer.t_user to 'andyqian'@'%';

當僅僅只設置可讀,可寫,可修改權限時,執行drop命令會有如下錯誤信息: mysql> drop table t_user;

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

列權限

在某些場景下,我們需要將權限精確到列上。我們也可以使用?grant命令來實現。

設置指定列的insert權限時: grant insert(created_at,updated_at) on customer.t_user to 'andyqian'@'localhost';

```

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'

撤銷權限

有添加權限,肯定也少不了撤銷權限。其語法與grant基本一致。僅僅只是關鍵字不同

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

查看用戶權限

上面說到,如果用戶執行沒有權限的命令時。則會顯示錯誤信息。為了避免這種情況發生。我們可以先通過以下命令來查看當前用戶擁有的權限。

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

其可以使用current_user()函數來表示當前登錄用戶。

例如:

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?表示沒有特殊權限的意思。使用?show grants命令查看時,通常會一起顯示在結果列表中。

第二句則表示用戶 andyqian 在customer數據庫中的t_user表中有select,insert 權限。

最后

有很多童鞋會覺得:數據庫管理,SQL優化,索引建立等等,都是DBA的事情。開發人員不需要了解。我認為這種認知是錯誤的,數據庫設計本身就是后端工程師工作職責的一部分。DBA 應該是設計的審核者,而不是建立者。

相關閱讀:

掃碼關注,一起進步

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的说说mysql_说说MySQL权限 - andyqian的个人空间 - OSCHINA - 中文开源技术交流社区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。