PolarDB-X 1.0賬號(hào)和權(quán)限系統(tǒng)的用法與MySQL一致,支持GRANT
、REVOKE
、SHOW GRANTS
、CREATE USER
、DROP USER
、SET PASSWORD
等語(yǔ)句。
賬號(hào)
賬號(hào)說(shuō)明
用戶名和主機(jī)名的組合username@'host'
可以確定一個(gè)賬號(hào)。用戶名一樣但是主機(jī)名不一樣則代表不同的賬號(hào)。例如lily@30.9.73.96
和lily@30.9.73.100
是兩個(gè)完全不同的賬號(hào),這兩個(gè)賬號(hào)的密碼和權(quán)限都可能不一樣。
在PolarDB-X 1.0控制臺(tái)創(chuàng)建完數(shù)據(jù)庫(kù)之后,系統(tǒng)會(huì)自動(dòng)在該數(shù)據(jù)庫(kù)下創(chuàng)建兩個(gè)系統(tǒng)賬號(hào):管理員賬號(hào)和只讀賬號(hào)。這兩個(gè)賬號(hào)是系統(tǒng)內(nèi)置的,不能刪除,不能修改其權(quán)限。
- 管理員賬號(hào)的名字跟數(shù)據(jù)庫(kù)名一致,比如數(shù)據(jù)庫(kù)名是
easydb
,管理員賬號(hào)的名字就叫easydb
。 - 只讀賬號(hào)的名字是數(shù)據(jù)庫(kù)名加上
_RO
后綴,比如數(shù)據(jù)庫(kù)名是easydb
,只讀賬號(hào)的名字就叫easydb_RO
。
例如有兩個(gè)數(shù)據(jù)庫(kù)dreamdb
、andordb
,根據(jù)上面的規(guī)則可知,dreamdb
下面包含管理員賬號(hào)dreamdb
,只讀賬號(hào)dreamdb_RO
;andordb
下面包含管理員賬號(hào)andordb
,只讀賬號(hào)andordb_RO
。
賬號(hào)規(guī)則
- 管理員賬號(hào)具有所有權(quán)限;
- 只有管理員賬號(hào)具有創(chuàng)建賬號(hào)和授權(quán)功能;其它賬號(hào)只能由管理員賬號(hào)創(chuàng)建,其權(quán)限只能由管理員賬號(hào)授予;
- 管理員賬號(hào)是跟數(shù)據(jù)庫(kù)綁定的,沒(méi)有其它數(shù)據(jù)庫(kù)的權(quán)限,連接的時(shí)候只能連接自己對(duì)應(yīng)的那個(gè)數(shù)據(jù)庫(kù),不能授予其它數(shù)據(jù)庫(kù)的權(quán)限給某個(gè)賬號(hào)。例如easydb這個(gè)管理員賬號(hào)只能連接easydb數(shù)據(jù)庫(kù),只能授予easydb數(shù)據(jù)庫(kù)權(quán)限或者easydb數(shù)據(jù)庫(kù)中表的權(quán)限給某個(gè)賬號(hào);
- 只讀賬號(hào)只具有SELECT權(quán)限。
命名規(guī)則
- 區(qū)分大小寫(xiě);
- 長(zhǎng)度必須大于等于4個(gè)字符,小于等于20個(gè)字符;
- 必須以字母開(kāi)頭;
- 字符可以包括大寫(xiě)字母、小寫(xiě)字母、數(shù)字。
密碼規(guī)則
- 長(zhǎng)度必須大于等于6個(gè)字符,小于等于20個(gè)字符;
- 字符可以包括大寫(xiě)字母、小寫(xiě)字母、數(shù)字、特殊字符(@#$%^&+=)。
HOST匹配規(guī)則
- HOST必須是純IP地址,可以包含
_
和%
通配符(_
代表一個(gè)字符,%
代表0個(gè)或多個(gè)字符)。含有通配符的HOST需要加上單引號(hào),例如lily@'30.9.%.%',david@'%'; - 假設(shè)系統(tǒng)中有兩個(gè)用戶都符合當(dāng)前登錄的用戶,則以最長(zhǎng)前綴匹配(不包含通配符的最長(zhǎng)IP段)的那個(gè)用戶為準(zhǔn)。例如系統(tǒng)有兩個(gè)用戶
david@'30.9.12_.xxx'
和david@'30.9.1%.234'
,在主機(jī)30.9.127.xxx
上面登錄david,則使用的是david@'30.9.12_.xxx'
這個(gè)用戶。 - 開(kāi)啟VPC時(shí),主機(jī)的IP地址會(huì)發(fā)生變化。
注意 為避免賬號(hào)和權(quán)限系統(tǒng)中的配置無(wú)效,請(qǐng)將HOST配置為'%'來(lái)匹配任意IP。
權(quán)限
權(quán)限級(jí)別支持情況
- 數(shù)據(jù)庫(kù)層級(jí)(支持)
- 表層級(jí)(支持)
- 全局層級(jí)(暫不支持)
- 列層級(jí)(暫不支持)
- 子程序?qū)蛹?jí)(暫不支持)
權(quán)限項(xiàng)
目前支持和表相關(guān)聯(lián)的8個(gè)基本權(quán)限項(xiàng):CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。
- TRUNCATE操作需要有表上的DROP權(quán)限;
- REPLACE操作需要有表上的INSERT和DELETE權(quán)限;
- CREATE INDEX和DROP INDEX操作需要有表上的INDEX權(quán)限;
- CREATE SEQUENCE需要有數(shù)據(jù)庫(kù)級(jí)的創(chuàng)建表(CREATE)權(quán)限;
- DROP SEQUENCE需要有數(shù)據(jù)庫(kù)級(jí)的刪除表(DROP)權(quán)限;
- ALTER SEQUENCE需要有數(shù)據(jù)庫(kù)級(jí)的更改表(ALTER)權(quán)限;
- INSERT ON DUPLICATE UPDATE語(yǔ)句需要有表上的INSERT和UPDATE權(quán)限。
權(quán)限規(guī)則
- 權(quán)限是綁定到賬號(hào)(username@’host’),不是綁定到用戶名(username);
- 授權(quán)的時(shí)候會(huì)判斷表是否存在,不存在則報(bào)錯(cuò);
- 數(shù)據(jù)庫(kù)權(quán)限級(jí)別從高到低依次是:全局級(jí)別權(quán)限(暫不支持)、數(shù)據(jù)庫(kù)級(jí)別權(quán)限、表級(jí)別權(quán)限、列級(jí)別權(quán)限。
- 高級(jí)別權(quán)限的授予會(huì)覆蓋低級(jí)別權(quán)限,移除高級(jí)別權(quán)限的同時(shí)也會(huì)移除低級(jí)別權(quán)限;
- 不支持USAGE授權(quán)。
給用戶授予多個(gè)庫(kù)權(quán)限
- 您可以在阿里云PolarDB-X 1.0控制臺(tái) “賬號(hào)管理” 頁(yè)面創(chuàng)建賬戶和授權(quán),推薦您使用此方法。
- 也可以使用SQL語(yǔ)句CREATE USER和GRANT創(chuàng)建賬戶和授權(quán)。
說(shuō)明 如果使用SQL語(yǔ)句,需注意:
- 只有管理員賬戶可以創(chuàng)建用戶和授權(quán)。
- 管理員只能給用戶授予自己庫(kù)的權(quán)限。如果A庫(kù)管理員創(chuàng)建了一個(gè)賬戶new_user@'%',要使new_user同時(shí)獲得訪問(wèn)A庫(kù)和B庫(kù)的權(quán)限,需要A庫(kù)管理員和B庫(kù)管理員分別為其授權(quán)。
擁有多個(gè)庫(kù)權(quán)限的用戶使用
- 如果用戶當(dāng)前登錄為A庫(kù),要查詢B庫(kù),需
use B; SELECT * FROM table_in_B;
,暫不支持跨庫(kù)查詢,如SELECT * FROM B.table_in_B;
。 - 如果用戶當(dāng)前登錄為A庫(kù),要寫(xiě)入B庫(kù),需
use B; INSERT INTO table_in_B VALUES('value');
,暫不支持跨庫(kù)插入,如INSERT INTO B.table_in_B VALUES('value');
。 - 其他SQL類型同理。
相關(guān)命令
創(chuàng)建賬號(hào)(CREATE USER)- 語(yǔ)法
CREATE USER user_specification [, user_specification] ... user_specification: user [ auth_option ] auth_option: IDENTIFIED BY 'auth#string'
- 示例
- 創(chuàng)建一個(gè)名為lily,只能從30.9.73.96登錄的賬號(hào),密碼為123456。
CREATE USER lily@30.9.73.96 IDENTIFIED BY '123456';
- 創(chuàng)建一個(gè)名為david,可以從任意主機(jī)登錄的賬號(hào),密碼為空。
CREATE USER david@'%';
- 創(chuàng)建一個(gè)名為lily,只能從30.9.73.96登錄的賬號(hào),密碼為123456。
- 語(yǔ)法
DROP USER user [, user] ...
- 示例
移除賬號(hào)lily@30.9.73.96:
DROP USER lily@30.9.73.96;
- 語(yǔ)法
SET PASSWORD FOR user = password_option password_option: { PASSWORD('auth_string') }
- 示例
修改賬號(hào)lily@30.9.73.96的密碼為123456。
SET PASSWORD FOR lily@30.9.73.96 = PASSWORD('123456')
給賬號(hào)授權(quán)(GRANT)
- 語(yǔ)法
GRANT priv_type[, priv_type] ... ON priv_level TO user_specification [, user_specification] ... [WITH GRANT OPTION] priv_level: { | db_name.* | db_name.tbl_name | tbl_name } user_specification: user [ auth_option ] auth_option: { IDENTIFIED BY 'auth#string' }
說(shuō)明 GRANT語(yǔ)句里面的賬號(hào)如果不存在,同時(shí)又沒(méi)有提供IDENTIFIED BY信息,則報(bào)賬號(hào)不存在異常;如果提供了IDENTIFIED BY信息,則會(huì)創(chuàng)建該賬號(hào)同時(shí)授權(quán)。 - 示例
- 在數(shù)據(jù)庫(kù)easydb下面,創(chuàng)建一個(gè)用戶名為david,可以在任意主機(jī)登錄,具有easydb數(shù)據(jù)庫(kù)所有權(quán)限的賬號(hào)。
#方法1:先創(chuàng)建賬號(hào)再授權(quán) CREATE USER david@'%' IDENTIFIED BY 'your#password'; GRANT ALL PRIVILEGES ON easydb.* to david@'%'; #方法2:一條語(yǔ)句完成創(chuàng)建賬號(hào)和授權(quán)兩個(gè)操作 GRANT ALL PRIVILEGES ON easydb.* to david@'%' IDENTIFIED BY 'your#password';
- 在數(shù)據(jù)庫(kù)easydb下面,創(chuàng)建一個(gè)用戶名為hanson,可以在任意主機(jī)登錄,具有easydb.employees表所有權(quán)限的賬號(hào)。
GRANT ALL PRIVILEGES ON easydb.employees to hanson@'%' IDENTIFIED BY 'your#password';
- 在數(shù)據(jù)庫(kù)easydb下面,創(chuàng)建一個(gè)用戶名為hanson,只能在192.168.3.10登錄,具有easydb.emp表的INSERT 和 SELECT權(quán)限的賬號(hào)。
GRANT INSERT,SELECT ON easydb.emp to hanson@'192.168.3.10' IDENTIFIED BY 'your#password';
- 在數(shù)據(jù)庫(kù)easydb下面創(chuàng)建一個(gè)只讀賬號(hào)actro,可以在任意主機(jī)登錄。
GRANT SELECT ON easydb.* to actro@'%' IDENTIFIED BY 'your#password';
- 在數(shù)據(jù)庫(kù)easydb下面,創(chuàng)建一個(gè)用戶名為david,可以在任意主機(jī)登錄,具有easydb數(shù)據(jù)庫(kù)所有權(quán)限的賬號(hào)。
- 語(yǔ)法
- 刪除賬號(hào)在某個(gè)權(quán)限級(jí)別下的權(quán)限項(xiàng),具體權(quán)限級(jí)別由priv_level指定。
REVOKE priv_type [, priv_type] ... ON priv_level
- 刪除賬號(hào)在系統(tǒng)內(nèi)(數(shù)據(jù)庫(kù)級(jí)別和表級(jí)別的)的所有權(quán)限項(xiàng)。
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
- 刪除賬號(hào)在某個(gè)權(quán)限級(jí)別下的權(quán)限項(xiàng),具體權(quán)限級(jí)別由priv_level指定。
- 示例
- 刪除hanson@’%’在easydb.emp表的CREATE、DROP、INDEX權(quán)限。
REVOKE CREATE,DROP,INDEX ON easydb.emp FROM hanson@'%';
- 刪掉賬號(hào)lily@30.9.73.96的所有權(quán)限。
REVOKE ALL PRIVILEGES,GRANT OPTION FROM lily@30.9.73.96;
說(shuō)明 為了兼容MySQL,需同時(shí)寫(xiě)上GRANT OPTION。
- 刪除hanson@’%’在easydb.emp表的CREATE、DROP、INDEX權(quán)限。
- 語(yǔ)法
SHOW GRANTS[ FOR user@host];
- 示例
SHOW GRANTS FOR user1@host;