示例: 數據庫
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級別。也就是訪問控制只支持到對象級別,沒法支持到行級和列級,可是能夠經過視圖的方法就行模擬控制。 併發