示例:
ALTER ROLE testgp SET search_path TO dm,"$user",public
testgp 是用户 dm 是 schedule的名字
GREENPLUM与ORACLE一样有着完全独立于操作系统的用户管理系统,以及权限管理系统。首先我们介绍一下GP中的数据库。在GP初始化系统后,GP会自动创建出三个数据库postgre,template0,template1. 其中postgre用作系统内部数据的存放,我们既不要删除它,也不要修改它。template1是系统默认的数据,我们创建数据库时可以以template1为模板,创建新的数据库。所以,如果有不希望其它数据库继承的对象,就不要在数据库template1中进行创建。GP中创建数据库的语法非常简单,句法如下
CREATE DATABASE newname USING TEMPLATE tmplatedbname;
速度非常快,这个过程中系统会生成相应的字典信息。如果没有指定using template子句,系统就使用template1数据库作为模板创建新数据库。我们也可以其它数据库为模板,创建新的数据库。template0数据库是创建template1的模板,一般我们也不使用它创建应用对象。GP允许在一个GP SERVER中创建多个DATABASE。但是一个DATABASE只能属于一个SERVER。一个连接在同一时间点只能访问一个数据库。
GP中也有SCHEMA的概念。SCHEMA本质就是一个数据库中有关联关系的对象集合,或者也可以理解成对象的命名空间。GP允许在一个数据库中创建多个SCHEMA,但是一个SCHEMA只能属于一个数据库。在创建数据库时,系统自动创建一个称为PUBLIC的SCHEMA。如果自己需要创建SCHEMA,其句法如下
CREATE SCHEMA schema_name;
一个SCHEMA中,不允许出现同名对象。但是不同的SCHEMA是允许对象同名的。所以很多SQL访问对象时可以在对象名前加SCHEMA作为前缀,说明对象出处。如果不加SCHEMA做前缀,访问对象,会话按指定的SCHEMA顺序搜索对象,默认的搜索路径只有public,新建的schema不会加到。这也是现在用户在使用工具时常见的一类问题。由于默认SCHEMA搜索路径设置不正确,导致应用无法访问到需要的对象。就像下面的过程
xjods=# create schema xjods;
CREATE SCHEMA
xjods=# create table xjods.t1(id numeric);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
xjods=#
xjods=# select * from t1;
ERROR: relation "t1" does not exist
LINE 1: select * from t1;
SCHEMA搜索路径的设置可以在会话中指定,可以在数据库层面指定,可以在用户层面指定,还可以在服务参数中指定。
在会话中指定,只对当前连接有效。
=> set search_path to 'myschema,public';
在数据库中指定,对特定数据库有效
=> alter database <dbname> set search_path to myschema,public
在用户层面设定,对的定用户的连接有效,比如
ALTER ROLE sally SET search_path TO myschema, public, pg_catalog;
想查看当前的schema,可以用如下命令
=> SELECT current_schema();
或者
=> SHOW search_path;
如果设置存在冲突,优先级是 会话设置 优先于 用户设置 优先于 数据库设置 优先于服务参数设置。
一般而且言,我们可以理解数据库对应着应用,SCHEMA则对应着每个应用的模块。在具体数据库设置时,可以根据需求进行灵活设置。比如要简化备份,减少系统负载的话,就应该尽量减少数据库的创建。因为这样可以减少备份的数量,以及字典的信息。
下面再来看GP中的用户。数据库的用户从本质上讲就是用于身份审核和权限管理的机制。与ORACLE一样GP也有完全独立于操作系统的用户管理模块。也就是GP的用户和操作系统用户没有多大关系。在创建数据库时,系统会创建一个称为gpadmin的超级管理员(建议用来安装GP操作系统用户也是gpadmin),默认该账号从服务器登录时,可以走操作系统认证,不需要用户名密码。它可以完成所有操作。GP中创建用户的句法如下
CREATE ROLE name [[WITH] option [ ... ]]
它的选项,指定了用户的身份认证,系统权限,以及资源限制等等 。具体选项如下
SUPERUSER | NOSUPERUSER
指定了用户是否是超级管理员,默认是NOSUPERUSER。 如果是超级管理员则没有访问限制。一般应用用户不要赋予这项权限。
CREATEDB | NOCREATEDB
指定了用户是否可以创建数据库。默认是NOCREATEDB
CREATEROLE | NOCREATEROLE
指定了用户是否可以创建新的用户,默认是NOCREATEROLE
CREATEEXTTABLE | NOCREATEEXTTABLE[ ( attribute='value'[, ...] ) ]
指定用户是否可以创建特定类型,特定协议的外部表。
可以指定的属性包括
type='readable'|'writable'
protocol='gpfdist'|'http'|'gphdfs'
如果使用file协议,或者execute协议的外部表,必须是超级管理员。
默认是 NOCREATEEXTTABLE
INHERIT | NOINHERIT
在GP中,没有独立的角色概念,用户既是角色,也是用户。因此当一个
LOGIN | NOLOGIN
设定用户是否有登录系统的权限。默认是NOLOGIN。一般用来管理权限的角色分配NOLOGIN权限。
CONNECTION LIMIT connlimit
限制并发连接的数量,默认值是-1,表示没有限制。在GP中有其它更合适的方式限制并发连接的数量,因此建议不要修改该设置。
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
设置用户的口令,并指定在字典中存放口令是否要进行加密。
VALID UNTIL 'timestamp'
指定口令的生命周期。默认是永远不过期。
IN ROLE rolename [, ...]
向角色中添加新的成员角色,这样新建用户就成了一个组的概念。可以使用grant命令实现同样的效果
ADMIN rolename [, ...]
向角色中添加新角色时,使用with admin option选项。允许角色把其它角色的权限再授予其它角色。
RESOURCE QUEUE queue_name
为用户建立资源队列后,控制用户连接的资源消耗。一个用户只能分配一个资源队列。=# CREATE ROLE admin CREATEROLE CREATEDB;
GP没有独立的用户组或者角色概念。我们可以把一个用户赋予另外一个用户,从而实现角色概念,简化权限的管理。比如
=# CREATE ROLE admin CREATEROLE CREATEDB;
=# GRANT admin TO john, sally;
=# REVOKE admin FROM bob;
那么admin就是组角色,john,sally就是成员角色,成员角色从组角色继承系统权限
同样,对象的所有者拥有对象的所有权限,如果把对象权限赋予组角色,那么组角色的成员角色也会获取相关对象的访问权限。比如
=# GRANT ALL ON TABLE mytable TO admin;
=# GRANT ALL ON SCHEMA myschema TO admin;
=# GRANT ALL ON DATABASE mydb TO admin;
那么,admin的成员角色也会得到相应的对象访问权限。
GP支持的对象权限包括
Object Type Privileges
Tables, Views, Sequences SELECT
INSERT
UPDATE
DELETE
RULE
ALL
External Tables SELECT
RULE
ALL
Databases CONNECT
CREATE
TEMPORARY | TEMP
ALL
Functions EXECUTE
Procedural Languages USAGE
Schemas CREATE
USAGE
ALL
由于GP没有提供SELECT/UPDATE/DELET ANY TABLE这样的系统权限,所以需要通过组角色进行模拟,因此会显得比ORACLE这样的数据库麻烦。另外,GP对行列访问控制的粒度只是到 Orange Book ‘C2’的安全级别,而不是B1级别。也就是访问控制只支持到对象级别,无法支持到行级和列级,但是可以通过视图的方法就行模拟控制。