PolarDB-X 1.0賬號(hào)和權(quán)限系統(tǒng)的用法與MySQL一致,支持GRANTREVOKESHOW GRANTSCREATE USERDROP USERSET PASSWORD等語(yǔ)句。

賬號(hào)

賬號(hào)說(shuō)明

用戶名和主機(jī)名的組合username@'host'可以確定一個(gè)賬號(hào)。用戶名一樣但是主機(jī)名不一樣則代表不同的賬號(hào)。例如lily@30.9.73.96lily@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ù)dreamdbandordb,根據(jù)上面的規(guī)則可知,dreamdb下面包含管理員賬號(hào)dreamdb,只讀賬號(hào)dreamdb_ROandordb下面包含管理員賬號(hào)andordb,只讀賬號(hào)andordb_RO

說(shuō)明 PolarDB-X 1.0里通過(guò)CREATE USER創(chuàng)建出來(lái)的賬號(hào)只存在于PolarDB-X 1.0,跟RDS沒(méi)有任何關(guān)系,也不會(huì)同步到后端的RDS中去。

賬號(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)限

5.3.6及以上版本的PolarDB-X 1.0,支持給單個(gè)用戶授予多個(gè)庫(kù)權(quán)限。授權(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ǔ)句,需注意:
    1. 只有管理員賬戶可以創(chuàng)建用戶和授權(quán)。
    2. 管理員只能給用戶授予自己庫(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)限的用戶使用

5.3.6及以上版本可以給用戶授予多個(gè)庫(kù)權(quán)限,如果new_user@’%’擁有了A和B庫(kù)的SELECT和INSERT權(quán)限。使用時(shí)有以下限制:
  • 如果用戶當(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@'%'; 
刪除賬號(hào)(DROP USER)
  • 語(yǔ)法
    DROP USER user [, user] ...    
  • 示例

    移除賬號(hào)lily@30.9.73.96:

    DROP USER lily@30.9.73.96;       
修改賬號(hào)密碼(SET PASSWORD)
  • 語(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';          
回收權(quán)限(REVOKE)
  • 語(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] ...           
  • 示例
    • 刪除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。
查詢授權(quán)(SHOW GRANTS)
  • 語(yǔ)法
    SHOW GRANTS[ FOR user@host];           
  • 示例
    SHOW GRANTS FOR user1@host;       
說(shuō)明 5.3.6及以上版本,SHOW GRANTS只顯示當(dāng)前用戶權(quán)限,可在阿里云PolarDB-X 1.0控制臺(tái)查看所有賬號(hào)和權(quán)限信息。