PolarDB-X 1.0帳號和許可權系統的用法與MySQL一致,支援GRANT
、REVOKE
、SHOW GRANTS
、CREATE USER
、DROP USER
、SET PASSWORD
等語句。
帳號
帳號說明
使用者名稱和主機名稱的組合username@'host'
可以確定一個帳號。使用者名稱一樣但是主機名稱不一樣則代表不同的帳號。例如lily@30.9.73.96
和lily@30.9.73.100
是兩個完全不同的帳號,這兩個帳號的密碼和許可權都可能不一樣。
在PolarDB-X 1.0控制台建立完資料庫之後,系統會自動在該資料庫下建立兩個系統帳號:管理員帳號和唯讀帳號。這兩個帳號是系統內建的,不能刪除,不能修改其許可權。
- 管理員帳號的名字跟資料庫名一致,比如資料庫名是
easydb
,管理員帳號的名字就叫easydb
。 - 唯讀帳號的名字是資料庫名加上
_RO
尾碼,比如資料庫名是easydb
,唯讀帳號的名字就叫easydb_RO
。
例如有兩個資料庫dreamdb
、andordb
,根據上面的規則可知,dreamdb
下麵包含管理員帳號dreamdb
,唯讀帳號dreamdb_RO
;andordb
下麵包含管理員帳號andordb
,唯讀帳號andordb_RO
。
說明 PolarDB-X 1.0裡通過CREATE USER建立出來的帳號只存在於PolarDB-X 1.0,跟RDS沒有任何關係,也不會同步到後端的RDS中去。
帳號規則
- 管理員帳號具有所有許可權;
- 只有管理員帳號具有建立帳號和授權功能;其它帳號只能由管理員帳號建立,其許可權只能由管理員帳號授予;
- 管理員帳號是跟資料庫綁定的,沒有其它資料庫的許可權,串連的時候只能串連自己對應的那個資料庫,不能授予其它資料庫的許可權給某個帳號。例如easydb這個管理員帳號只能串連easydb資料庫,只能授予easydb資料庫許可權或者easydb資料庫中表的許可權給某個帳號;
- 唯讀帳號只具有SELECT許可權。
命名規則
- 區分大小寫;
- 長度必須大於等於4個字元,小於等於20個字元;
- 必須以字母開頭;
- 字元可以包括大寫字母、小寫字母、數字。
密碼規則
- 長度必須大於等於6個字元,小於等於20個字元;
- 字元可以包括大寫字母、小寫字母、數字、特殊字元(@#$%^&+=)。
HOST匹配規則
- HOST必須是純IP地址,可以包含
_
和%
萬用字元(_
代表一個字元,%
代表0個或多個字元)。含有萬用字元的HOST需要加上單引號,例如lily@'30.9.%.%',david@'%'; - 假設系統中有兩個使用者都符合當前登入的使用者,則以最長首碼匹配(不包含萬用字元的最長IP段)的那個使用者為準。例如系統有兩個使用者
david@'30.9.12_.xxx'
和david@'30.9.1%.234'
,在主機30.9.127.xxx
上面登入david,則使用的是david@'30.9.12_.xxx'
這個使用者。 - 開啟VPC時,主機的IP地址會發生變化。重要 為避免帳號和許可權系統中的配置無效,請將HOST配置為'%'來匹配任意IP。
許可權
權限等級支援情況
- 資料庫層級(支援)
- 表層級(支援)
- 全域層級(暫不支援)
- 列層級(暫不支援)
- 子程式層級(暫不支援)
許可權項
目前支援和表相關聯的8個基本許可權項:CREATE、DROP、ALTER、INDEX、INSERT、DELETE、UPDATE、SELECT。
- TRUNCATE操作需要有表上的DROP許可權;
- REPLACE操作需要有表上的INSERT和DELETE許可權;
- CREATE INDEX和DROP INDEX操作需要有表上的INDEX許可權;
- CREATE SEQUENCE需要有資料庫級的建立表(CREATE)許可權;
- DROP SEQUENCE需要有資料庫級的刪除表(DROP)許可權;
- ALTER SEQUENCE需要有資料庫級的更改表(ALTER)許可權;
- INSERT ON DUPLICATE UPDATE語句需要有表上的INSERT和UPDATE許可權。
許可權規則
- 許可權是綁定到帳號(username@’host’),不是綁定到使用者名稱(username);
- 授權的時候會判斷表是否存在,不存在則報錯;
- 資料庫權限等級從高到低依次是:全域層級許可權(暫不支援)、資料庫層級許可權、表層級許可權、列層級許可權。
- 進階別許可權的授予會覆蓋低層級許可權,移除進階別許可權的同時也會移除低層級許可權;
- 不支援USAGE授權。
給使用者授予多個庫許可權
5.3.6及以上版本的PolarDB-X 1.0,支援給單個使用者授予多個庫許可權。授權方式如下:
- 您可以在阿里雲PolarDB-X 1.0控制台 “帳號管理” 頁面建立賬戶和授權,推薦您使用此方法。
- 也可以使用SQL語句CREATE USER和GRANT建立賬戶和授權。說明 如果使用SQL語句,需注意:
- 只有管理員賬戶可以建立使用者和授權。
- 管理員只能給使用者授予自己庫的許可權。如果A庫管理員建立了一個賬戶new_user@'%',要使new_user同時獲得訪問A庫和B庫的許可權,需要A庫管理員和B庫管理員分別為其授權。
擁有多個庫許可權的使用者使用
5.3.6及以上版本可以給使用者授予多個庫許可權,如果new_user@’%’擁有了A和B庫的SELECT和INSERT許可權。使用時有以下限制:
- 如果使用者當前登入狀態A庫,要查詢B庫,需
use B; SELECT * FROM table_in_B;
,暫不支援跨庫查詢,如SELECT * FROM B.table_in_B;
。 - 如果使用者當前登入狀態A庫,要寫入B庫,需
use B; INSERT INTO table_in_B VALUES('value');
,暫不支援跨庫插入,如INSERT INTO B.table_in_B VALUES('value');
。 - 其他SQL類型同理。
相關命令
建立帳號(CREATE USER)- 文法
CREATE USER user_specification [, user_specification] ... user_specification: user [ auth_option ] auth_option: IDENTIFIED BY 'auth#string'
- 樣本
- 建立一個名為lily,只能從30.9.73.96登入的帳號,密碼為123456。
CREATE USER lily@30.9.73.96 IDENTIFIED BY '123456';
- 建立一個名為david,可以從任意主機登入的帳號,密碼為空白。
CREATE USER david@'%';
- 建立一個名為lily,只能從30.9.73.96登入的帳號,密碼為123456。
- 文法
DROP USER user [, user] ...
- 樣本
移除帳號lily@30.9.73.96:
DROP USER lily@30.9.73.96;
- 文法
SET PASSWORD FOR user = password_option password_option: { PASSWORD('auth_string') }
- 樣本修改帳號lily@30.9.73.96的密碼為123456。
SET PASSWORD FOR lily@30.9.73.96 = PASSWORD('123456')
給帳號授權(GRANT)
- 文法
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' }
說明 GRANT語句裡面的帳號如果不存在,同時又沒有提供IDENTIFIED BY資訊,則報帳號不存在異常;如果提供了IDENTIFIED BY資訊,則會建立該帳號同時授權。 - 樣本
- 在資料庫easydb下面,建立一個使用者名稱為david,可以在任意主機登入,具有easydb資料庫所有許可權的帳號。
#方法1:先建立帳號再授權 CREATE USER david@'%' IDENTIFIED BY 'your#password'; GRANT ALL PRIVILEGES ON easydb.* to david@'%'; #方法2:一條陳述式完成建立帳號和授權兩個操作 GRANT ALL PRIVILEGES ON easydb.* to david@'%' IDENTIFIED BY 'your#password';
- 在資料庫easydb下面,建立一個使用者名稱為hanson,可以在任意主機登入,具有easydb.employees表所有許可權的帳號。
GRANT ALL PRIVILEGES ON easydb.employees to hanson@'%' IDENTIFIED BY 'your#password';
- 在資料庫easydb下面,建立一個使用者名稱為hanson,只能在192.168.3.10登入,具有easydb.emp表的INSERT 和 SELECT許可權的帳號。
GRANT INSERT,SELECT ON easydb.emp to hanson@'192.168.3.10' IDENTIFIED BY 'your#password';
- 在資料庫easydb下面建立一個唯讀帳號actro,可以在任意主機登入。
GRANT SELECT ON easydb.* to actro@'%' IDENTIFIED BY 'your#password';
- 在資料庫easydb下面,建立一個使用者名稱為david,可以在任意主機登入,具有easydb資料庫所有許可權的帳號。
- 文法
- 刪除帳號在某個權限等級下的許可權項,具體權限等級由priv_level指定。
REVOKE priv_type [, priv_type] ... ON priv_level
- 刪除帳號在系統內(資料庫層級和表層級的)的所有許可權項。
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
- 刪除帳號在某個權限等級下的許可權項,具體權限等級由priv_level指定。
- 樣本
- 刪除hanson@’%’在easydb.emp表的CREATE、DROP、INDEX許可權。
REVOKE CREATE,DROP,INDEX ON easydb.emp FROM hanson@'%';
- 刪掉帳號lily@30.9.73.96的所有許可權。
REVOKE ALL PRIVILEGES,GRANT OPTION FROM lily@30.9.73.96;
說明 為了相容MySQL,需同時寫上GRANT OPTION。
- 刪除hanson@’%’在easydb.emp表的CREATE、DROP、INDEX許可權。
- 文法
SHOW GRANTS[ FOR user@host];
- 樣本
SHOW GRANTS FOR user1@host;
說明 5.3.6及以上版本,SHOW GRANTS只顯示目前使用者許可權,可在阿里雲PolarDB-X 1.0控制台查看所有帳號和許可權資訊。