學習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權限即可執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM