DCL(Data Control Language)語句:數據控制語句,用於控制不同數據段直接的許可和訪問級別的語句。這些語句定義了資料庫、表、欄位、用戶的訪問許可權和安全級別。 ...
SQL語言大致分為
DCL
、DDL
、DML
三種,本文主要介紹MySQL 5.7
版本DCL
語句。
概述
DCL(Data Control Language)語句:數據控制語句,用於控制不同數據段直接的許可和訪問級別的語句。這些語句定義了資料庫、表、欄位、用戶的訪問許可權和安全級別。
關鍵字
GRANT
REVOKE
查看用戶許可權
當成功創建用戶賬戶後,還不能執行任何操作,需要為該用戶分配適當的訪問許可權。可以使用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
許可權;- 第一種語法格式用於回收指定用戶的某些特定的許可權,第二種回收指定用戶的所有許可權;