Hologres兼容PostgreSQL,采用與標準PostgreSQL語句相同的授權體系(簡稱專家模式)。本文為您介紹Hologres如何使用專家權限模型對用戶授權及撤銷授權。
專家權限模型授權
在Hologres實例連接開發工具后,可以使用SQL語句通過專家權限模型授權,使該用戶具有實例的相關權限。
創建用戶。
一個賬號必須先被創建成為Hologres的用戶,才能訪問Hologres并進行開發。
創建用戶的語句格式如下:
--創建具有登錄Hologres實例權限的用戶,如果是為RAM用戶授權,賬號格式請使用RAM用戶的表達格式。 CREATE USER "云賬號ID/云郵箱"; --創建用戶并授予Superuser權限。 CREATE USER "云賬號ID/云郵箱" SUPERUSER;
您可以參照如下示例創建用戶,其中更多關于阿里云賬號和RAM用戶的格式說明,請參見賬號概述。
--使用阿里云賬號ID創建用戶。 CREATE USER "11822780xxx"; --授予RAM用戶Superuser權限。 CREATE USER "p4_1822780xxx" SUPERUSER;
更多關于創建角色的說明,請參見CREATE ROLE。
授予權限。
將賬號創建為Hologres的用戶后,您需要授予用戶一定的權限,該用戶才能在權限范圍內使用Hologres。在專家權限模型下可以控制用戶在數據庫、表、視圖、列級別的權限。Hologres中常用的授權操作如下表所示。
說明目前專家模式只能對現有實例對象進行授權,對授權后創建的內容不生效。例如,用戶A對用戶B授予了public schema中所有表的查看權限。當用戶A創建一張新表,則用戶B不具有對這張表的查看權限,需要重新授權。
權限描述
語法示例
是否必須
創建具有登錄Hologres實例權限的用戶
CREATE USER "云賬號/云郵箱";
是
創建用戶并授予用戶Superuser的權限
CREATE USER "云賬號/云郵箱" SUPERUSER ;
可選
授予在Schema下創建表的權限
GRANT CREATE ON SCHEMA schema_name TO "云賬號/云郵箱";
可選
授予Schema訪問權限
GRANT USAGE ON SCHEMA schema_name TO "云賬號/云郵箱";
必須
說明必須授予Schema的訪問權限才能有表的查詢權限。
授予所有用戶public schema中所有表的查看、寫入、及修改權限
GRANT SELECT,INSERT,UPDATE ON ALL TABLES IN SCHEMA public to PUBLIC;
可選
授予用戶某個表的SELECT權限
GRANT SELECT ON TABLE <tablename> TO "云賬號/云郵箱";
可選
授予用戶某個表的SELECT權限,并允許該用戶授予此權限給其他用戶
GRANT SELECT ON TABLE <tablename> TO "云賬號/云郵箱" WITH GRANT OPTION;
可選
授予用戶public schema中所有表的SELECT權限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "云賬號/云郵箱";
可選
設置當前授權人在
public
Schema下創建的未來表對所有人可讀。ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;
可選
修改普通用戶為Superuser
ALTER USER "云賬號/云郵箱" SUPERUSER;
可選
修改Superuser為普通用戶
ALTER USER "云賬號/云郵箱" NOSUPERUSER;
可選
授予其他用戶表的Owner權限
ALTER TABLE <tablename> OWNER TO "云賬號/云郵箱";
可選
創建沒有登錄Hologres實例權限的角色
CREATE ROLE "云賬號/云郵箱";
可選
授予某個用戶某個角色的權限
GRANT <rolename> TO "云賬號/云郵箱" ;
可選
授予某個用戶某個表的某些列的查詢權限
GRANT SELECT (<column1>,<column2>,<column3>,...) ON TABLE <tablename> TO "云賬號/云郵箱" ;
可選
授予某個用戶某個視圖的查詢權限
說明專家權限模型下訪問視圖需要授予視圖的查詢權限。
SPM/SLPM權限模型下訪問視圖需要有viewer及以上用戶組的權限。
--專家權限模型給某個用戶授予view的查詢權限 GRANT SELECT ON <viewname> TO "云賬號/云郵箱" ;
可選
在專家模型下,您可以參照以下示例給一個新用戶授予某張表的查詢權限。
CREATE USER "云賬號/云郵箱"; GRANT USAGE ON SCHEMA <schema_name> TO "云賬號/云郵箱"; GRANT SELECT ON TABLE <tablename> TO "云賬號/云郵箱";
CREATE ROLE用于創建沒有登錄Hologres實例權限的角色,例如代表一類具體用戶的用戶組或虛擬角色等。更多關于權限的授予的說明,請參見GRANT。
刪除表。
只有Superuser或表Owner才可以刪除表。您可以使用如下幾種方法授予某個用戶或多個用戶刪除表的權限:
替換新用戶為表的Owner。
ALTER TABLE TABLENAME OWNER TO "云賬號/云郵箱";
授予新用戶Superuser權限。
ALTER USER "云賬號/云郵箱" SUPERUSER;
添加多個用戶至用戶組并授予表Owner權限。
CREATE USER "云賬號ID/云郵箱"; CREATE ROLE <rolename>; GRANT <rolename> TO "云賬號/云郵箱"; ALTER TABLE <tablename> OWNER TO <rolename>;
未來表授權
由于專家模式授權不包含對未來表的授權,因此需要使用ALTER DEFAULT PRIVILEGES語句對未來表進行授權。具體操作步驟如下:
該命令語句不影響已有的邏輯對象。
該命令語句只能設置TABLE、SCHEMA、FUNCTION、SEQUENCE或TYPE的默認權限。
授權。
默認執行授權語句的人,在某個Schema下新建的表對所有人或指定人進行查詢。示例語句如下。
執行授權的人在public schema下,新建的表可以被子賬號p4_123xxx查詢。
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO "p4_123xxx";
執行授權的人在test schema下,新建的表可以被子賬號p4_123xxx查詢。
ALTER DEFAULT PRIVILEGES IN SCHEMA test GRANT SELECT ON TABLES TO "p4_123xxx";
執行授權的人在public schema下,新建的表可以被所有人查詢。
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;
默認授權后,其他人新建表時可被指定所有人或指定人進行查詢。示例語句如下。
授權后,p4_id1新建的表可以被public schema下的所有用戶訪問。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;
授權后,p4_id1新建的表可以被public schema下的子賬號p4_id2訪問。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO "p4_id2";
授權后,p4_id1新建的表可以被test schema下的所有用戶訪問。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test GRANT SELECT ON TABLES TO PUBLIC;
撤銷設置的默認授權,有的場景您需要撤銷您設置的默認授權,示例語句如下。
--撤銷執行授權的人在public schema下未來新建的表可以被子賬號p4_123xxx查詢的默認授權 ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM "p4_123xxx"; --撤銷執行授權的人在test schema下未來新建的表可以被子賬號p4_123xxx查詢的默認授權 ALTER DEFAULT PRIVILEGES IN SCHEMA test REVOKE SELECT ON TABLES FROM "p4_123xxx"; --撤銷執行授權的人在public schema下未來新建的表可以被所有人查詢的默認授權 ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM PUBLIC;
查看默認權限是否設置成功。
使用\ddp命令在Psql客戶端查看ALTER DEFAULT PRIVILEGES是否設置成功。
使用如下SQL命令在Hologres中直接查詢。
SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Owner", n.nspname AS "Schema", CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' WHEN 'n' THEN 'schema' END AS "Type", pg_catalog.array_to_string(d.defaclacl, E'\n') AS "Access privileges" FROM pg_catalog.pg_default_acl d LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace ORDER BY 1, 2, 3;
創建新表時,Hologres會使用當前用戶和模式去匹配系統表pg_catalog.pg_default_acl。如果檢查到匹配項ALTER DEFAULT PRIVILEGES,則為用戶添加匹配項規則。當前用戶說明如下:
如果當前用戶是User,則創建表時使用User進行匹配。
如果用戶User創建表之前執行了
SET SESSION ROLE GROUP1;
語句,此時當前用戶就變為GROUP1,則創建表時使用GROUP1進行匹配。
匹配規則只在創建表時執行,在創建表之后執行
ALTER TABLE SET OWNER TO
語句修改表Owner,不會觸發對應匹配項規則。
專家模式撤銷授權
使用REVOKE語句撤銷用戶權限的示例如下,更多關于權限的撤銷操作,請參見REVOKE。
REVOKE SELECT ON TABLE tablename FROM "云賬號ID/云郵箱" ; --如果是RAM用戶,賬號格式請使用RAM用戶的表達格式。
查看權限
通過以下SQL命令查看用戶的角色及權限。
SELECT ROLNAME FROM pg_roles;
SELECT user_display_name(ROLNAME) FROM pg_roles;
刪除用戶
若您的實例已經連接開發工具,您可以使用SQL語句進行刪除子賬號,分為如下兩種情況。
刪除普通用戶
如果是刪除普通用戶,并且該賬號沒有創建其他對象(如表、視圖、extension等),可以執行以下命令語句或者直接在HoloWeb刪除用戶。
drop user "云賬號ID/云郵箱";
刪除Superuser等管理員
若是要刪除Superuser、Admin等管理員,但是該賬號創建過表、視圖、extension等實例內對象,并且是這些對象的管理員(尤其是專家權限模型下),若是直接刪除用戶會報錯,需要先將該賬號下的對象進行轉移,執行以下命令語句。
-- 將A賬號下的對象轉給B reassign owned by "A云賬號ID" to "B云賬號ID"; -- 刪除A賬號 drop user "A云賬號ID";
您可以使用以下方式刪除實例中的RAM用戶:
DROP USER "云賬號ID/云郵箱";
RAM用戶被刪除后,將不能連接實例并訪問實例內的任何對象,請您謹慎操作。
標準的PostgreSQL對于權限有著非常嚴格的劃分,對此我們提供最佳實踐供您根據業務需求選擇和參考,詳情請參見基于PostgreSQL標準權限模型授權。