权限管理
权限管理
在实际的项目中,我们建议用户规划好不同数据库用户的职责,并给它赋予相应的操作权限,以保证数据库的安全。在InCloud ZNBASE中,可以使用GRANT和REVOKE命令进行权限的授予和撤销且可通过查询语句查询权限状态。为了使用的灵活性,在用户拥有权限的同时,还可以赋予用户赋权他人的能力。
权限的授予
权限的授予,用于授予用户操作数据库对象或表数据的权限。用户必须拥有目标数据库、模式、表或列的欲授予权限,且拥有为他人授权(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
模式名称,是以逗号分隔的数据库模式名称列表,在模式上授予的权限,会影响用户模式本身的操作或模式下对象的操作。
proc_name
存储过程名称。
func_args_with_defaults
存储过程的参数,存储过程的名称与参数共同构成了赋权时存储过程对象,如果参数为空,则以proc_name +“()”的形式,如果不为空,则以proc_name+“(type1,type2,…)”的形式,其中type为参数的类型。
user_name
用户或角色名称,是以逗号分隔的用户/角色列表。
对用户的授权,可以对权限类型和权限适用对象进行控制。
权限类型
一次可以给用户授予多个权限,多个权限之间使用逗号“,”分隔。下面对不同的权限进行介绍。
权限 | 适用级别 | 描述 |
---|---|---|
ALL | DATABASE,TABLE, SCHEMA,COLUMN,PROCEDURE | 该对象可获得的所有权限 |
CREATE | DATABASE,TABLE, SCHEMA | 创建权限 |
DROP | DATABASE,TABLE, SCHEMA,PROCEDURE | 删除对象权限 |
USAGE | DATABASE,SCHEMA | 使用权限 |
SELECT | TABLE,COLUMN | 查询数据权限 |
INSERT | TABLE,COLUMN | 新增数据权限 |
DELETE | TABLE | 删除数据权限 |
UPDATE | TABLE,COLUMN | 更新数据权限 |
TRIGGER | TABLE | 触发器权限 |
REFERENCES | TABLE | 更改关系属性权限 |
EXECUTE | PROCEDURE | 执行权限 |
授权适用对象
为用户授权的对象可以是数据库,也可以是表。可以为用户授予多个对象的多个权限,多个对象之间使用逗号“,”分隔。
示例
示例1:授予用户user1在数据库db上创建模式的权限,并且此用户可以将此权限继续授予给其他用户。
GRANT CREATE ON DATABASE db1 TO user1 WITH GRANT OPTION;
查看授权情况:
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授权删除表的权限。
GRANT DELETE ON TABLE db1.sc.t1, db1.sc.t2 TO user1;
查看授权情况:
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语法格式如下:
参数说明
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为参数的类型。
user_name
用户或角色名称,是以逗号分隔的用户/角色列表。
撤销用户权限,可以对权限类型和权限适用对象进行控制。
权限类型
一次可以撤销用户多个权限,多个权限之间使用逗号“,”分隔。下面对不同的权限进行介绍。
权限 | 适用级别 | 描述 |
---|---|---|
ALL | DATABASE,TABLE, SCHEMA,COLUMN,PROCEDURE | 该对象可获得的所有权限 |
CREATE | DATABASE,TABLE, SCHEMA | 创建权限 |
DROP | DATABASE,TABLE, SCHEMA,PROCEDURE | 删除对象权限 |
USAGE | DATABASE,SCHEMA | 使用权限 |
SELECT | TABLE,COLUMN | 查询数据权限 |
INSERT | TABLE,COLUMN | 新增数据权限 |
DELETE | TABLE | 删除数据权限 |
UPDATE | TABLE,COLUMN | 更新数据权限 |
TRIGGER | TABLE | 触发器权限 |
REFERENCES | TABLE | 更改关系属性权限 |
EXECUTE | PROCEDURE | 执行权限 |
撤销权限适用对象
撤销用户权限的对象可以是数据库,也可以是表。可以撤销用户多个对象的多个权限,多个对象之间使用逗号“,”分隔。
示例
示例1:撤销数据库权限
SHOW GRANTS ON DATABASE db1 FOR user1;
database_name | grantor | grantee | privilege_type | grantable
+———————-+————-+————-+————————+—————-+
db1 | root | public | USAGE | NO db1 | root | user1 | CREATE | YES
REVOKE CREATE ON DATABASE db1 FROM user1;
REVOKE
SHOW GRANTS ON DATABASE db1 FOR user1; database_name | grantor | grantee | privilege_type | grantable
+———————-+————-+————-+————————+—————-+
db1 | root | public | USAGE | NO (1 row) |
撤销用户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权限。
ROLE IF EXISTS role2;