用戶/角色在整個數據庫實例中是全局的。
用戶和角色區別是用戶默認有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權限即可執行。