全部產品
Search
文件中心

PolarDB:帳號和許可權系統

更新時間:Jul 06, 2024

PolarDB-X 1.0帳號和許可權系統的用法與MySQL一致,支援GRANTREVOKESHOW GRANTSCREATE USERDROP USERSET PASSWORD等語句。

帳號

帳號說明

使用者名稱和主機名稱的組合username@'host'可以確定一個帳號。使用者名稱一樣但是主機名稱不一樣則代表不同的帳號。例如lily@30.9.73.96lily@30.9.73.100是兩個完全不同的帳號,這兩個帳號的密碼和許可權都可能不一樣。

PolarDB-X 1.0控制台建立完資料庫之後,系統會自動在該資料庫下建立兩個系統帳號:管理員帳號和唯讀帳號。這兩個帳號是系統內建的,不能刪除,不能修改其許可權。

  • 管理員帳號的名字跟資料庫名一致,比如資料庫名是easydb,管理員帳號的名字就叫easydb
  • 唯讀帳號的名字是資料庫名加上_RO尾碼,比如資料庫名是easydb,唯讀帳號的名字就叫easydb_RO

例如有兩個資料庫dreamdbandordb,根據上面的規則可知,dreamdb下麵包含管理員帳號dreamdb,唯讀帳號dreamdb_ROandordb下麵包含管理員帳號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語句,需注意:
    1. 只有管理員賬戶可以建立使用者和授權。
    2. 管理員只能給使用者授予自己庫的許可權。如果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@'%'; 
刪除帳號(DROP USER)
  • 文法
    DROP USER user [, user] ...    
  • 樣本

    移除帳號lily@30.9.73.96:

    DROP USER lily@30.9.73.96;       
修改帳號密碼(SET PASSWORD)
  • 文法
    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';          
回收許可權(REVOKE)
  • 文法
    • 刪除帳號在某個權限等級下的許可權項,具體權限等級由priv_level指定。
      REVOKE
      priv_type
      [, priv_type] ...
      ON priv_level         
    • 刪除帳號在系統內(資料庫層級和表層級的)的所有許可權項。
      REVOKE ALL PRIVILEGES, GRANT OPTION
      FROM user [, user] ...           
  • 樣本
    • 刪除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。
查詢授權(SHOW GRANTS)
  • 文法
    SHOW GRANTS[ FOR user@host];           
  • 樣本
    SHOW GRANTS FOR user1@host;       
說明 5.3.6及以上版本,SHOW GRANTS只顯示目前使用者許可權,可在阿里雲PolarDB-X 1.0控制台查看所有帳號和許可權資訊。