如何授予權限給 Amazon Redshift 中新建立的物件?

2 分的閱讀內容
0

我的使用者收到新建立物件的權限遭拒錯誤。如何授與使用者存取結構描述中新建立物件的必要權限?

簡短描述

若要讓使用者存取結構描述中新建立的物件,超級使用者必須授與物件的權限。

當使用者無法存取結構描述中新建立的物件時,他們可能會收到下列錯誤:

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 的超級使用者使用以下範例命令授予 newtestusernewtestschema 結構描述以及該結構描述下目前存在的所有資料表的存取權限:

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

前面的命令授予 newtestusernewtestschema 下存在的目前資料表的 SELECT 存取權限。目前,newtestschema 下僅存在 newtesttable1 資料表。newtesttable1 資料表可供 newtestuser 存取。

接下來,awsusernewtestschema 下建立另一個名為 newtesttable2 的資料表。如果 newtestuser 在資料表 newtestschema.newtesttable2 上執行 SELECT 查詢,他們會看到以下錯誤:

ERROR: permission denied for relation newtesttable2.

若要解決此錯誤,awsuser 會執行下列動作:

1.    執行下列範例命令,授予對資料表 newtesttable2 的存取權:

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    透過執行下列範例命令,授予 newtestuserawsusernewtestschema 下建立的任何未來資料表的存取權:

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

現在,當 awsusernewtestschema 下建立另一個名為 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

輸出結果顯示 awsusernewtestuser 授予 awsusernewtestschema 中建立的所有新資料表的 SELECT 權限。


相關資訊

PG_DEFAULT_ACL

AWS 官方
AWS 官方已更新 2 年前