GREENPLUM介绍之数据库管理(四)-创建数据库和用户管理
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级别。也就是访问控制只支持到对象级别,无法支持到行级和列级,但是可以通过视图的方法就行模拟控制。