权限管理

    ​ 权限的授予,用于授予用户操作数据库对象或表数据的权限。用户必须拥有目标数据库、模式、表或列的欲授予权限,且拥有为他人授权(GRANT OPTION)的属性,才能为其他用户或角色进行赋权。为用户授予权限的语法是GRANT语法。下面进行详细介绍。

    语法格式

    GRANT语法格式如下:

    参数说明

    • column_name

      列名,是以逗号分隔的列名列表。在列上授予的权限,会影响用户对列的操作。拥有表上的权限,会拥有该表所有列的权限。

    • table_pattern

      table的名称模式,是以逗号分隔的表名列表。可以是最简单的表名称;也可以是database_name.table_name模式。要授予所有表权限,要使用*:ON TABLE *授予数据库中所有现有表权限,但不会影响之后创建的表;要授予某个具体数据库的所有表权限,要使用database_name.*:ON [TABLE ] database_name.*授予指定数据库database_name中所有现有表的权限,但是不会影响之后创建的表。

    • database_name

      数据库名称,是以逗号分隔的数据库名称列表。在数据库上授予的权限,会被创建在该数据库的所有新表继承,但不会影响数据库中的现有表。

    • schema_name

      模式名称,是以逗号分隔的数据库模式名称列表,在模式上授予的权限,会影响用户模式本身的操作或模式下对象的操作。

    • func_args_with_defaults

      存储过程的参数,存储过程的名称与参数共同构成了赋权时存储过程对象,如果参数为空,则以proc_name +“()”的形式,如果不为空,则以proc_name+“(type1,type2,…)”的形式,其中type为参数的类型。

    • user_name

      用户或角色名称,是以逗号分隔的用户/角色列表。

    对用户的授权,可以对权限类型和权限适用对象进行控制。

    权限类型

    一次可以给用户授予多个权限,多个权限之间使用逗号“,”分隔。下面对不同的权限进行介绍。

    授权适用对象

    为用户授权的对象可以是数据库,也可以是表。可以为用户授予多个对象的多个权限,多个对象之间使用逗号“,”分隔。

    示例

    示例1:授予用户user1在数据库db上创建模式的权限,并且此用户可以将此权限继续授予给其他用户。

    查看授权情况:

    SHOW GRANTS ON DATABASE db1 FOR user1;

    database_name | grantor | grantee | privilege_type | grantable

    +———————-+————-+————-+————————+—————-+

    db1 | root | public | USAGE | NO db1 | root | user1 | CREATE | YES (2 rows) |

    用户user1已经拥有了数据库db1的CREATE权限。

    示例2:授权用户user1删除模式sc的权限。

    GRANT DROP ON SCHEMA db1.sc TO user1;

    查看授权情况:

    SHOW GRANTS ON SCHEMA db1.sc FOR user1;

    database_name | schema_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+————-+————-+————————+—————-+

    db1 | sc | root | user1 | DROP | NO

    用户user1已经拥有了数据库db1模式sc的DROP权限。

    示例3:为用户useer1授权删除表的权限。

    查看授权情况:

    SHOW GRANTS ON TABLE db1.sc.t1, db1.sc.t2 FOR user1;

    database_name | schema_name | table_name | column_name | grantor | grantee | privilege_type | grantable

    db1 | sc | t1 | | root | user1 | DELETE | NO db1 | sc | t2 | | root | user1 | DELETE | NO

    用户user1已经拥有了db1.sc.t1和db1.sc.t2的DELETE权限。

    示例4:授予用户表t1列上的权限。

    GRANT SELECT (id, name) ON TABLE db1.sc.t1 TO user1;

    查看权限情况:

    SHOW GRANTS ON TABLE db1.sc.t1 FOR user1;

    database_name | schema_name | table_name | column_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+——————+——————-+————-+————-+————————+—————-+

    db1 | sc | t1 | | root | user1 | DELETE | NO

    db1 | sc | t1 | id | root | user1 | SELECT | NO

    db1 | sc | t1 | name | root | user1 | SELECT |

    用户user1拥有了db1.sc.t1上id,name列的SELECT权限。

    权限的撤销

    ​ 权限的撤销,用于撤销用户或角色操作数据库对象或表数据的权限。用户必须拥有目标数据库、模式、表或列的欲撤回权限,且拥有为他人撤权(GRANT OPTION)的属性,才能为其他用户或角色进行撤权。撤销用户权限的语法是REVOKE语法。下面进行详细介绍。

    语法格式

    REVOKE语法格式如下:

    权限管理 - 图1

    参数说明

    • column_name

      列名,是以逗号分隔的列名列表。在列上授予的权限,会影响用户对列的操作。撤销表上的权限,会撤销该表所有列的权限。撤销列的权限,不会对该表的权限产生影响。

    • table_pattern

      table的名称模式,是以逗号分隔的表名列表。可以是最简单的表名称;也可以是database_name.table_name模式。要撤销所有表权限,要使用*:ON TABLE *撤销数据库中所有现有表的权限,但不会影响之后创建的表;要插销某个具体数据库的所有表权限,要使用database_name.*:ON [TABLE ] database_name.*撤销指定数据库database_name中所有现有表的权限,但是不会影响之后创建的表。

    • database_name

      数据库名称,是以逗号分隔的数据库名称列表。

    • schema_name

      模式名称,是以逗号分隔的数据库模式名称列表,在模式上授予的权限,会影响用户模式本身的操作或模式下对象的操作。

    • proc_name

      存储过程名称。

    • func_args_with_defaults

      存储过程的参数,存储过程的名称与参数共同构成了赋权时存储过程对象,如果参数为空,则以proc_name +“()”的形式,如果不为空,则以proc_name+“(type1,type2,…)”的形式,其中type为参数的类型。

    撤销用户权限,可以对权限类型和权限适用对象进行控制。

    权限类型

    一次可以撤销用户多个权限,多个权限之间使用逗号“,”分隔。下面对不同的权限进行介绍。

    权限适用级别描述
    ALLDATABASE,TABLE, SCHEMA,COLUMN,PROCEDURE该对象可获得的所有权限
    CREATEDATABASE,TABLE, SCHEMA创建权限
    DROPDATABASE,TABLE, SCHEMA,PROCEDURE删除对象权限
    USAGEDATABASE,SCHEMA使用权限
    SELECTTABLE,COLUMN查询数据权限
    INSERTTABLE,COLUMN新增数据权限
    DELETETABLE删除数据权限
    UPDATETABLE,COLUMN更新数据权限
    TRIGGERTABLE触发器权限
    REFERENCESTABLE更改关系属性权限
    EXECUTEPROCEDURE执行权限

    撤销权限适用对象

    撤销用户权限的对象可以是数据库,也可以是表。可以撤销用户多个对象的多个权限,多个对象之间使用逗号“,”分隔。

    示例

    示例1:撤销数据库权限

    撤销用户user1对数据库db1的CREATE权限。

    示例2:撤销数据库中模式的权限。

    SHOW GRANTS ON SCHEMA db1.sc FOR user1;

    database_name | schema_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+————-+————-+————————+—————-+

    db1 | sc | root | user1 | DROP | NO

    REVOKE DROP ON SCHEMA db1.sc FROM user1;

    REVOKE

    SHOW GRANTS ON SCHEMA db1.sc FOR user1;

    database_name | schema_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+————-+————-+————————+—————-+

    (0 rows)

    撤销了用户user1对数据库db1模式sc的DROP权限。

    示例3:撤销用户对指定数据库中表的权限。

    SHOW GRANTS ON TABLE db1.sc.t1 FOR user1;

    database_name | schema_name | table_name | column_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+——————+——————-+————-+————-+————————+—————-+

    db1 | sc | t1 | | root | user1 | DELETE | NO

    db1 | sc | t1 | id | root | user1 | SELECT | NO

    db1 | sc | t1 | name | root | user1 | SELECT | NO

    REVOKE DELETE ON TABLE db1.sc.t1 FROM user1;

    REVOKE

    SHOW GRANTS ON TABLE db2.t1;

    database_name | schema_name | table_name | column_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+——————+——————-+————-+————-+————————+—————-+

    db1 | sc | t1 | id | root | user1 | SELECT | NO db1 | sc | t1 | name | root | user1 | SELECT | NO

    收回了用户user1对db1.sc.t1的DELETE权限。

    示例4:撤销用户在列上的权限。

    SHOW GRANTS ON TABLE db1.sc.t1 FOR user1;

    database_name | schema_name | table_name | column_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+——————+——————-+————-+————-+————————+—————-+

    db1 | sc | t1 | id | root | user1 | SELECT | NO

    db1 | sc | t1 | name | root | user1 | SELECT | NO

    REVOKE SELECT (id, name) ON TABLE db1.sc.t1 FROM user1;

    REVOKRE

    SHOW GRANTS ON TABLE db1.t1 FOR user1;

    database_name | schema_name | table_name | column_name | grantor | grantee | privilege_type | grantable

    +———————-+——————-+——————+——————-+————-+————-+————————+—————-+

    (0 rows) |

    撤销了用户user1对db1.sc.t1上id,name列的SELECT权限。