限制账号只能访问指定表、视图、字段

控制台创建的账号授权后默认是可以管理整个数据库,如果只想要账号管理数据库中的某个表、视图、字段,可以通过SQL命令进行授权。

前提条件

创建高权限账号

操作步骤

  1. 通过命令行、客户端连接RDS MySQL实例

  2. 通过以下命令创建新用户并授权管理数据库下的表、视图、字段:

    说明

    此账号在控制台上无法查看到所属数据库。

    • 创建新用户并授权管理数据库中的表

      CREATE USER `<用户名>`@`%`IDENTIFIED BY '<密码>';
      GRANT PROCESS, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '<用户名>'@'%';
      GRANT ALL PRIVILEGES ON `<数据库名>`.`<表名>`  TO '<用户名>'@'%';
      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`.`time_zone_transition` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`proc` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`help_category` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`help_relation` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`help_keyword` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`general_log` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`time_zone_leap_second` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`time_zone_transition_type` TO '<用户名>'@'%';
      GRANT SELECT ON `mysql`.`time_zone_name` 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'@'%';
        GRANT SELECT ON `mysql`.`time_zone` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`slow_log` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`time_zone_transition` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`proc` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`help_category` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`help_relation` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`help_keyword` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`general_log` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`time_zone_leap_second` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`time_zone_transition_type` TO 'test01'@'%';
        GRANT SELECT ON `mysql`.`time_zone_name` TO 'test01'@'%';
        说明

        如果将命令第三行的test100更改为*,就和通过控制台创建的账号一样了,也可以在控制台看见此账号的所属数据库

      • 授权多表:创建新用户test02并授权管理数据库rds001中的表test100,test200test300。

        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'@'%';
        GRANT SELECT ON `mysql`.`time_zone` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`slow_log` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`time_zone_transition` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`proc` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`help_category` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`help_relation` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`help_keyword` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`general_log` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`time_zone_leap_second` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`time_zone_transition_type` TO 'test02'@'%';
        GRANT SELECT ON `mysql`.`time_zone_name` TO 'test02'@'%';
    • 授权查询数据库中的视图

      GRANT SELECT ON <数据库名>.<视图名> to <用户名>;

      示例

      • 授权单表:授权用户test01查询数据库rds001的视图view_test1。

        GRANT SELECT ON rds001.view_test1 to test01;
      • 授权多表:授权用户test01查询数据库rds001的视图view_test1view_test2。

        GRANT SELECT ON rds001.view_test1 to test01;
        GRANT SELECT ON rds001.view_test2 to test01;
    • 授权更新或查询表中的字段

      GRANT UPDATE (<字段名>) ON TABLE <表名> to <用户名>;     -----授权更新表中字段
      GRANT SELECT (<字段名>) ON TABLE <表名> to <用户名>;     -----授权查询表中字段

      示例

      • 授权单表:授权用户test01更新表testtable的字段testid。

        GRANT UPDATE (testid) ON TABLE testtable to test01;
      • 授权多表:授权用户test01更新表testtable的字段test_idtest_name。

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

    除了通过SQL命令,也可以在DMS上进行修改。详情请参见MySQL数据库账号权限管理