如何授予權限給 Amazon Redshift 中新建立的物件?
我的使用者收到新建立物件的權限遭拒錯誤。如何授與使用者存取結構描述中新建立物件的必要權限?
簡短描述
若要讓使用者存取結構描述中新建立的物件,超級使用者必須授與物件的權限。
當使用者無法存取結構描述中新建立的物件時,他們可能會收到下列錯誤:
ERROR: permission denied for relation “objectname”.
授與存取權時,僅針對結構描述中存在的目前物件授予存取權時,就會發生此錯誤。依預設,不會自動授與對結構描述下建立的未來物件的存取權。
若要解決此問題,請使用 ALTER DEFAULT PRIVILEGES 命令將存取權限授與使用者。
解決方案
若要授與結構描述中目前和未來資料表的權限,請以超級使用者身分執行下列動作:
1. 若要授與對結構描述的使用權限,以及對結構描述下目前存在之所有資料表的 SELECT 存取權限,請執行下列命令:
**備註:**將 newtestschema 取代為您結構描述的名稱,並將 newtestuser 取代為使用者的名稱。
grant usage on schema newtestschema to newtestuser; grant select on all tables in schema newtestschema to newtestuser;
2. 若要授與使用者對結構描述下建立之未來資料表的 SELECT 存取權限,請執行下列命令**:備註:**將 awsuser 取代為在結構描述下建立未來物件時所用的使用者名稱,將 newtestschema 取代為結構描述名稱,以及將 newtestuser 取代為需要未來物件存取權的使用者名稱。
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
**備註:**預設權限僅適用於新物件。執行 ALTER DEFAULT PRIVILEGES 不會變更現有物件的權限。
3. 若要確認已授與使用者預設權限,請以超級使用者身分執行下列查詢:
select pg_get_userbyid(d.defacluser) as user, n.nspname as schema, case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end as object_type, array_to_string(d.defaclacl, ' + ') as default_privileges from pg_catalog.pg_default_acl d left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;
如果存在存取權,則您將在 default_privileges 欄下看到該使用者的項目。
現在,當超級使用者在結構描述下建立新物件時,使用者將擁有資料表的 SELECT 存取權。
範例
下列範例會從此組態開始:
- 一個名為 newtestuser 的使用者,不是超級使用者。
- 一個名為 newtestschema 的結構描述和一個名為 newtesttable1 的資料表,該資料表在結構描述下有幾條記錄。
名為 awsuser 的超級使用者使用以下範例命令授予 newtestuser 對 newtestschema 結構描述以及該結構描述下目前存在的所有資料表的存取權限:
grant usage on schema newtestschema to newtestuser; grant select on all tables in schema newtestschema to newtestuser;
前面的命令授予 newtestuser 對 newtestschema 下存在的目前資料表的 SELECT 存取權限。目前,newtestschema 下僅存在 newtesttable1 資料表。newtesttable1 資料表可供 newtestuser 存取。
接下來,awsuser 在 newtestschema 下建立另一個名為 newtesttable2 的資料表。如果 newtestuser 在資料表 newtestschema.newtesttable2 上執行 SELECT 查詢,他們會看到以下錯誤:
ERROR: permission denied for relation newtesttable2.
若要解決此錯誤,awsuser 會執行下列動作:
1. 執行下列範例命令,授予對資料表 newtesttable2 的存取權:
grant select on table newtestschema.newtesttable2 to newtestuser;
2. 透過執行下列範例命令,授予 newtestuser 對awsuser 在newtestschema 下建立的任何未來資料表的存取權:
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
現在,當 awsuser 在 newtestschema 下建立另一個名為 newtesttable3 的新資料表時,newtestuser 將對 newtesttable3 具有 SELECT 存取權限。
3. 為了驗證是否已授予 newtestuser 預設權限,awsuser 會執行以下查詢:
select pg_get_userbyid(d.defacluser) as user, n.nspname as schema, case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end as object_type, array_to_string(d.defaclacl, ' + ') as default_privileges from pg_catalog.pg_default_acl d left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;
上述查詢的輸出類似下列內容:
user | schema | object_type | default_privileges awsuser | newtestschema | tables | newtestuser=r/awsuser
輸出結果顯示 awsuser 為 newtestuser 授予 awsuser 在 newtestschema 中建立的所有新資料表的 SELECT 權限。
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 2 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前