整理一下查詢使用者權限的方法。
預設權限
RedShift 提供了 SVV_DEFAULT_PRIVILEGES 這張表來查詢預設權限:
SELECT
owner_type,
owner_name,
schema_name,
object_type,
privilege_type,
grantee_name,
admin_option
FROM svv_default_privileges
WHERE
(
grantee_type = 'user'
AND grantee_name = 'user1'
)
OR grantee_type = 'public'
考慮到有些預設權限是全域賦予的,這裡有補了一個 grantee_type = 'public' 的語句。
其輸出為:
| owner type | owner name | schema name | object type | privilege type | grantee name | admin option |
|---|---|---|---|---|---|---|
| user | admin | foo | RELATION | SELECT | user1 | True |
| user | user2 | RELATION | SELECT | public | False |
其解讀方式為:
- 當使用者
admin在 schemafoo建立新的 relation 時,user1會被自動賦予SELECT權限,附帶再賦予此權限給其他使用者的權限。 - 當使用者
user2在任意 schema 建立新的 relation 時,public 會被自動賦予SELECT權限,不附帶再賦予的權限。故user1也可以從此詞條得到對應的權限。
輸出的值的部分:
- Object type 可為
RELATION,FUNCTION或PROCEDURE,而 table 及 view 共掛為 relation 這個類別。 - Privilege type 的值有
INSERT,SELECT,UPDATE,DELETE,REFERENCES或DROP。
另外一種方法:使用 PostgreSQL 的 `pg_default_acl` 查詢
RedShift 的底層為 PostgreSQL 故我們也能用 PSQL 的方法來做查詢。使用者預設權限被列在 PG_DEFAULT_ACL 裡面,可利用以下的指令查詢:
SELECT
pg_get_userbyid(pg_default_acl.defacluser) AS grantor,
pg_namespace.nspname as schema,
CASE pg_default_acl.defaclobjtype
WHEN 'r' THEN 'relation'
WHEN 'f' THEN 'function'
WHEN 'p' THEN 'stored procedure'
END AS object_type,
array_to_string(pg_default_acl.defaclacl, ', ') as default_privileges
FROM pg_catalog.pg_default_acl
LEFT JOIN pg_catalog.pg_namespace ON pg_namespace.oid = pg_default_acl.defaclnamespace
其輸出資訊如:
| grantor | schema | object_type | default_privileges |
|---|---|---|---|
| admin | relation | user1=r/admin | |
| admin | foo | relation | user2=w*/admin |
其解讀方式為:當 <grantor> 在 <schema> 下建立起新的 <object_type> 時,<default_privileges> 清單中的權限會被賦予。
其中 default_privileges 是被攤平的 aclitem[] 陣列,內文格式會以 使用者 = 權限字串 / 賦予者 呈現,又權限字串是以下列字元湊合而成:
| privilege string | represent |
|---|---|
r |
查詢 (read; SELECT) |
a |
新增 (append; INSERT) |
w |
修改 (write; UPDATE) |
d |
刪除 (DELETE) |
x |
允許建立 foreign key |
X |
執行函數或呼叫程序 |
* |
用於其餘權限的後綴,代表此使用者得以將此權限再賦予給其他使用者 |
以上面預設權限的表格為例:
- 當
admin在任意 schema 建立 table 或 view 時,user1會被賦予SELECT權限 - 當
admin在 schemafoo建立 table 或 view 時,user2會被賦予附帶GRANT能力的UPDATE權限
命名空間權限
對於使用者在 schema 的既有權限可利用 SVV_SCHEMA_PRIVILEGES 查詢。由於我只想要查詢特定使用者的權限,故使用這樣的指令:
SELECT
identity_name,
namespace_name AS schema,
privilege_type,
admin_option
FROM SVV_SCHEMA_PRIVILEGES
WHERE
(
identity_type = 'user'
AND identity_name = 'user1'
)
OR identity_type = 'public'
輸出資訊如:
| identity name | schema | privilege type | admin option |
|---|---|---|---|
| user1 | foo | CREATE | False |
| public | foo | USAGE | False |
其中 privilege type 可為 USAGE 或 CREATE。
表格權限
我們可以從 SVV_RELATION_PRIVILEGES 查詢使用者在表格的權限。一樣的情境,由於我想要查詢特定使用者的權限,故:
SELECT
identity_name,
namespace_name AS schema,
relation_name,
privilege_type,
admin_option
FROM SVV_RELATION_PRIVILEGES
WHERE
(
identity_type = 'user'
AND identity_name = 'user1'
)
OR identity_type = 'public'
其中 privilege type 的值有 INSERT, SELECT, UPDATE, DELETE, REFERENCES 或 DROP。