blog:https://www.cnblogs.com/Rohn/
SQL語言大致分為
DCL、DDL、DML三種,本文主要介紹MySQL 5.7版本DCL語句。
概述
DCL(Data Control Language)語句:數據控制語句,用於控制不同數據段直接的許可和訪問級別的語句。這些語句定義了數據庫、表、字段、用戶的訪問權限和安全級別。
關鍵字
GRANTREVOKE
查看用戶權限
當成功創建用戶賬戶后,還不能執行任何操作,需要為該用戶分配適當的訪問權限。可以使用SHOW GRANTS FOR 語句來查詢用戶的權限。例如:
mysql> SHOW GRANTS FOR test;
+-------------------------------------------+
| Grants for test@% |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' |
+-------------------------------------------+
1 row in set (0.00 sec)
GRANT語句
參考:
對於新建的MySQL用戶,必須給它授權,可以用GRANT語句來實現對新建用戶的授權。
語法格式
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
TO user [, user] ...
[WITH GRANT OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
權限類型(priv_type)
授權的權限類型一般可以分為數據庫、表、列、用戶。
授予數據庫權限類型
授予數據庫權限時,priv_type可以指定為以下值:
SELECT:表示授予用戶可以使用 SELECT 語句訪問特定數據庫中所有表和視圖的權限。INSERT:表示授予用戶可以使用 INSERT 語句向特定數據庫中所有表添加數據行的權限。DELETE:表示授予用戶可以使用 DELETE 語句刪除特定數據庫中所有表的數據行的權限。UPDATE:表示授予用戶可以使用 UPDATE 語句更新特定數據庫中所有數據表的值的權限。REFERENCES:表示授予用戶可以創建指向特定的數據庫中的表外鍵的權限。CREATE:表示授權用戶可以使用 CREATE TABLE 語句在特定數據庫中創建新表的權限。ALTER:表示授予用戶可以使用 ALTER TABLE 語句修改特定數據庫中所有數據表的權限。SHOW VIEW:表示授予用戶可以查看特定數據庫中已有視圖的視圖定義的權限。CREATE ROUTINE:表示授予用戶可以為特定的數據庫創建存儲過程和存儲函數的權限。ALTER ROUTINE:表示授予用戶可以更新和刪除數據庫中已有的存儲過程和存儲函數的權限。INDEX:表示授予用戶可以在特定數據庫中的所有數據表上定義和刪除索引的權限。DROP:表示授予用戶可以刪除特定數據庫中所有表和視圖的權限。CREATE TEMPORARY TABLES:表示授予用戶可以在特定數據庫中創建臨時表的權限。CREATE VIEW:表示授予用戶可以在特定數據庫中創建新的視圖的權限。EXECUTE ROUTINE:表示授予用戶可以調用特定數據庫的存儲過程和存儲函數的權限。LOCK TABLES:表示授予用戶可以鎖定特定數據庫的已有數據表的權限。-
SHOW DATABASES:表示授權可以使用SHOW DATABASES語句查看所有已有的數據庫的定義的權限。
ALL或ALL PRIVILEGES:表示以上所有權限。
授予表權限類型
授予表權限時,priv_type可以指定為以下值:
SELECT:授予用戶可以使用 SELECT 語句進行訪問特定表的權限。INSERT:授予用戶可以使用 INSERT 語句向一個特定表中添加數據行的權限。DELETE:授予用戶可以使用 DELETE 語句從一個特定表中刪除數據行的權限。DROP:授予用戶可以刪除數據表的權限。UPDATE:授予用戶可以使用 UPDATE 語句更新特定數據表的權限。ALTER:授予用戶可以使用 ALTER TABLE 語句修改數據表的權限。REFERENCES:授予用戶可以創建一個外鍵來參照特定數據表的權限。CREATE:授予用戶可以使用特定的名字創建一個數據表的權限。INDEX:授予用戶可以在表上定義索引的權限。ALL或ALL PRIVILEGES:所有的權限名。
授予列(字段)權限類型
授予列(字段)權限時,priv_type的值只能指定為SELECT、INSERT和UPDATE,同時權限的后面需要加上列名列表(column-list)。
授予創建和刪除用戶的權限
授予列(字段)權限時,priv_type的值指定為CREATE USER權限,具備創建用戶、刪除用戶、重命名用戶和撤消所有特權,而且是全局的。
ON
有ON,是授予權限,無ON,是授予角色。如:
-- 授予數據庫db1的所有權限給指定賬戶
GRANT ALL ON db1.* TO 'user1'@'localhost';
-- 授予角色給指定的賬戶
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
對象類型(object_type)
在ON關鍵字后給出要授予權限的object_type,通常object_type可以是數據庫名、表名等。
權限級別(priv_level)
指定權限級別的值有以下幾類格式:
*:表示當前數據庫中的所有表。*.*:表示所有數據庫中的所有表。db_name.*:表示某個數據庫中的所有表,db_name指定數據庫名。db_name.tbl_name:表示某個數據庫中的某個表或視圖,db_name指定數據庫名,tbl_name指定表名或視圖名。tbl_name:表示某個表或視圖,tbl_name指定表名或視圖名。db_name.routine_name:表示某個數據庫中的某個存儲過程或函數,routine_name指定存儲過程名或函數名。
被授權的用戶(user)
語法格式如下:
'user_name'@'host_name'
- Tips:
'host_name'用於適應從任意主機訪問數據庫而設置的,可以指定某個地址或地址段訪問。- 可以同時授權多個用戶。
user表中host列的默認值
| host | 說明 |
|---|---|
| % | 匹配所有主機 |
| localhost | localhost不會被解析成IP地址,直接通過UNIXsocket連接 |
| 127.0.0.1 | 會通過TCP/IP協議連接,並且只能在本機訪問 |
| ::1 | ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1 |
host_name格式有以下幾種:
- 使用
%模糊匹配,符合匹配條件的主機可以訪問該數據庫實例,例如192.168.2.%或%.test.com; - 使用
localhost、127.0.0.1、::1及服務器名等,只能在本機訪問; - 使用ip地址或地址段形式,僅允許該ip或ip地址段的主機訪問該數據庫實例,例如
192.168.2.1或192.168.2.0/24或192.168.2.0/255.255.255.0; - 省略即默認為
%。
身份驗證方式(auth_option)
auth_option為可選字段,可以指定密碼以及認證插件(mysql_native_password、sha256_password、caching_sha2_password)。
加密連接(tls_option)
tls_option為可選的,一般是用來加密連接。
用戶資源限制(resource_option)
resource_option為可選的,一般是用來指定最大連接數等。
| 參數 | 說明 |
|---|---|
| MAX_QUERIES_PER_HOUR count | 每小時最大查詢數 |
| MAX_UPDATES_PER_HOUR count | 每小時最大更新數 |
| MAX_CONNECTIONS_PER_HOUR count | 每小時連接次數 |
| MAX_USER_CONNECTIONS count | 用戶最大連接數 |
權限生效
若要權限生效,需要執行以下語句:
FLUSH PRIVILEGES;
REVOKE語句
REVOKE語句主要用於撤銷權限。
語法格式
REVOKE語法和GRANT語句的語法格式相似,但具有相反的效果
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
- 若要使用
REVOKE語句,必須擁有MySQL數據庫的全局CREATE USER權限或UPDATE權限;- 第一種語法格式用於回收指定用戶的某些特定的權限,第二種回收指定用戶的所有權限;
