全部產品
Search
文件中心

ApsaraDB RDS:限制帳號只能訪問指定表、視圖、欄位

更新時間:Mar 19, 2025

通過控制台建立的資料庫帳號,預設情況下可以選擇授予其管理整個資料庫的許可權。如果需要限制帳號僅管理資料庫中的某些表、視圖或欄位,則可以通過 SQL 命令進行精細化授權。

前提條件

建立高許可權帳號

操作步驟

  1. 使用高許可權帳號通過命令列、用戶端串連RDS MySQL執行個體

  2. 執行以下命令,建立新使用者並授予其管理特定資料庫中表、視圖和欄位的許可權。

    說明

    此帳號在控制台上無法查看到所屬資料庫。

    1. 建立新使用者:

      CREATE USER `<使用者名稱>`@`%` IDENTIFIED BY '<密碼>';
    2. 為使用者授予全域許可權(如 PROCESS 和複製相關許可權):

      GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '<使用者名稱>'@'%';
    3. 為使用者授予對指定資料庫中表的完全控制許可權:

      GRANT ALL PRIVILEGES ON `<資料庫名>`.`<表名>` TO '<使用者名稱>'@'%';
    4. 為使用者授予對 mysql 系統資料庫中常用表的唯讀許可權:

      GRANT SELECT ON `mysql`.`help_topic` TO '<使用者名稱>'@'%';
      GRANT SELECT ON `mysql`.`func` TO '<使用者名稱>'@'%';
      GRANT SELECT ON `mysql`.`time_zone` TO '<使用者名稱>'@'%';
      GRANT SELECT ON `mysql`.`slow_log` TO '<使用者名稱>'@'%';
      GRANT SELECT ON `mysql`.`proc` TO '<使用者名稱>'@'%';
      GRANT SELECT ON `mysql`.`general_log` TO '<使用者名稱>'@'%';
      -- 其他系統資料表許可權可根據需求添加

      樣本

      • 授權單表:建立新使用者test01並授權管理資料庫rds001中的表test100。

        CREATE USER `test01`@`%`IDENTIFIED BY 'passwd';
        GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test01'@'%';
        GRANT ALL PRIVILEGES ON `rds001`.`test100`  TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`help_topic` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`func` TO 'test01'@'%';
        說明

        如果將test100替換為*,則該使用者將擁有對rds001資料庫中所有表的許可權,並且可以在RDS控制台上查看其所屬資料庫。

      • 授權多表:建立新使用者test02並授權管理資料庫rds001中的表test100,test200和test300。

        CREATE USER `test02`@`%`IDENTIFIED BY 'passwd';
        GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test02'@'%';
        GRANT ALL PRIVILEGES ON `rds001`.`test100`  TO 'test02'@'%';
        GRANT ALL PRIVILEGES ON `rds001`.`test200`  TO 'test02'@'%';
        GRANT ALL PRIVILEGES ON `rds001`.`test300`  TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`help_topic` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`func` TO 'test02'@'%';
    5. 授權查詢資料庫中的視圖:

      GRANT SELECT ON <資料庫名>.<視圖名> to <使用者名稱>;

      樣本

      • 授權單個視圖:授權使用者test01查詢資料庫rds001的視圖view_test1。

        GRANT SELECT ON rds001.view_test1 to test01;
      • 授權多個視圖:授權使用者test01查詢資料庫rds001的視圖view_test1和view_test2。

        GRANT SELECT ON rds001.view_test1 to test01;
        GRANT SELECT ON rds001.view_test2 to test01;
    6. 授權更新或查詢表中的欄位 :

      GRANT UPDATE (<欄位名>) ON TABLE <表名> to <使用者名稱>;     -----授權更新表中欄位
      GRANT SELECT (<欄位名>) ON TABLE <表名> to <使用者名稱>;     -----授權查詢表中欄位

      樣本

      • 授權單個欄位:授權使用者test01更新表testtable的欄位testid。

        GRANT UPDATE (testid) ON TABLE testtable to test01;
      • 授權多個欄位:授權使用者test01更新表testtable的欄位test_id和test_name。

        GRANT UPDATE (test_id) ON TABLE testtable to test01;
        GRANT UPDATE (test_name) ON TABLE testtable to test01;

    除了通過SQL命令,也可以在DMS上進行修改。詳情請參見MySQL資料庫帳號許可權管理

常見問題

Q:執行SQL報錯提示“Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation TraceId.”怎麼解決?

A:

  • 報錯原因:SQL指令碼裡麵包括CREATE USER許可權的語句,您當前帳號許可權不足。

  • 解決方案:

    • (方式一)使用高許可權帳號登入資料庫後執行。

    • (方式二)通過GRANT CREATE USER ON *.* TO 'your_user'@'host';FLUSH PRIVILEGES;為普通帳號授予CREATE USER許可權後再執行。