首页 > 代码库 > 学习Greenplum的资源授权
学习Greenplum的资源授权
用户/角色在整个数据库实例中是全局的。
用户和角色区别是用户默认有LOGIN权限,其他同。
在系统初始化时有个预定的超级用户,操作系统用户名,比如gpadmin。
每个数据库的逻辑结构对象都有一个所有者,所有者默认拥有所有权限,不需要重新赋予。
删除和任意修改它的权利不能赋予别人,为所有者固有,不能被赋予或撤销。
可以把操作该对象的权限赋予别人。
授权和撤销授权 用命令GRANT REVOKE
权限的总结
权限按如下几个层次进行管理:
1) 首先管理赋予在用户特殊属性上的权限
2) 在数据库上的权限
3) 在数据库中创建模式的权限
4) 在模式中创建数据库对象的权限,表,索引等
5) 表的增删改查的权限
6) 操作表中某些字段的权限
管理赋予在用户特殊属性上的权限
验证结论:
1) user的 Superuser与createuser属性不能同时拥有。
2) 有superuser属性的用户实际可以创建库和创建用户,且nocreateuser nocreatedb 对superuser属性没有约束。
3) create role创建用户,alter role修改用户属性。删除用户drop role,同理删除数据库是drop database;
4) 拥有资源的用户不能被drop,提示错误。但是资源可以被superuser drop掉。
5) 修改用户属性用alter role
在数据库上的权限
Gpadmin创建一个数据库,依次授予某用户 CREATE CONNECT TEMPORARY TEMP 的权限。验证各选项的作用。
创建用户tu1 ,赋予对testdb数据库CREATE权限,则可以在testdb下创建schema;
# grant create on database testdb to tu1;
撤销用户的connect权限
# revoke connect on database testdb from tu1;
验证结论:
1) 实际可以使用控制的权限是CREATE。CONNECT,TEMP即使提示取消权限成功了,仍可以CONNECT和创建临时表。
2) 属性(nosuperuser,nocreatedb,nocreaterole)的用户默认情况下可以connect数据库。
不可以创建schema。
可以创建temporary table ,自动生成临时的schema,在会话结束后自动销毁。
可以在public schema中创建表。
不能在owner为其他用户的schema下创建表。
3) 数据库的CREATE权限,控制是否可以在库中创建Schema
4) 通过身份验证的用户总有CONNECT库的权限。即使是通过REVOKE撤销CONNECT,也能正常连接数据库。
5) 用户总有创建TEMP表的权限。即使是通过REVOKE撤销TEMP,也能创建临时表。
在模式上的权限
创建一个tu1所有的schema tu1shema;创建用户tu2;
验证tu2字tu1schema中创建表。
赋予USAGE权限看是否有变化。
# grant usage on schema tu1schema to tu2;
赋予CREATE权限看是否有变化。
# grant create on schema tu1schema to tu2;
验证结论:
1) 如果要在别人的schema中创建自己的表,需要用户对该shema有CREATE,USAGE权限,才可以对表和数据有足够权限。
2) 用户默认无法在owner为别个用户的schema中创建表。
3) 用户默认无法看到owner为别个用户的schema中的表,注意设置search_path 。(\dt命令查看)。
4) 赋予USAGE权限后可以看到owner为别个用户的schema中的表,但无法在里面创建表。
5) 赋予CREATE权限后可以在别个用户的schema中创建表,但如果没有USAGE权限,仍无法看到表,无法查询表中的数据,也无法更改表,即使owner是你也不行。再赋予USAGE后可以查询自己创建的表,可以更改自己创建的表,但无法查询别人的表。
6)
在表上的权限
Q:Tu1的schema中的表,是否可以赋予tu2 对表中数据select的权限,而无需对shema赋权限即可做操作呢。
当前tu2对tu1schema没有任何权限。
# grant select on tu1schema.table1 to tu2;
验证 testdb=> select * from tu1schema.table1;
ERROR: permission denied for schema tu1schema
赋予tu2对tu1schema的USAGE权限。再查询成功。
赋予增删改权限后才能增删改。
# grant select,update,delete,insert on tu1schema.table1 to tu2;
验证结论:
1) 需要逐级授权,如果需要对表有权限,那么至少也得在表所属的schema有权限。
2) 表上面有 SELECT ,INSERT,UPDATE,DELETE授权。
在sequence上的权限
#create sequence sequid owned by table2.uid;
这样创建了一个sequence,有什么用呢?并不会自动给table2.uid赋值。
使用时仍是用 insert into ** values(nextval(‘seqid’),…
#grant UPDATE on sequence sequid to tu2;
#revoke UPDATE on sequence sequid from tu2;
验证结论:
1) sequence与表同级,提供顺序的序列号。
2) 其他用户调用nextval(‘seqname’)需要有UPDATE权限。需要对sequence所属的schema有USAGE权限。
3) 从\h grant 看到SEQUENCE有 USAGE,SELECT,UPDATE权限,但是测试发现只要有UPDATE权限就可以调用获取sequence的值。
4)
在视图上的权限
验证结论:
没有在视图上的权限,应该是在视图对应的基础表上设置权限。理应如此。
在函数上的权限
函数只有EXECUTE权限。和表属于同一层。
testdb=# grant execute on function tu1schema.proc1() to tu2;
GRANT
testdb=# revoke execute on function tu1schema.proc1() from tu2;
REVOKE
验证结论:
1) 对函数的GRANT和REVOKE测试是不起作用。
2) 在函数所属的schema层有USAGE权限即可执行。
学习Greenplum的资源授权