示例: 数据库
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级别。也就是访问控制只支持到对象级别,没法支持到行级和列级,可是能够经过视图的方法就行模拟控制。 并发