跳至內容

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

2 分的閱讀內容
0

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

簡短說明

想要存取結構描述中新建立物件的使用者,必須具有物件擁有者或超級使用者授予的存取權限。

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

「錯誤:關係 '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 * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    若要查看直接授予使用者的權限,請以超級使用者身分執行下列查詢:

    SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';

解決方案範例

以下範例以此組態開始:

  • 假設有一個名為 newtestuser 的使用者,並且該該使用者不是超級使用者。
  • 假設名為 newtestschema 的結構描述,並且在該結構描述下有一個名為 newtesttable1 的資料表,且其中包含一些記錄。

假設有一個名為 awsuser 的超級使用者授予 newtestusernewtestschema 結構描述以及所有目前存在資料表的存取權。為了授予存取權,awsuser 可以使用下列範例命令:

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

此命令授予 newtestusernewtestschema 下所有目前資料表的 SELECT 存取權。目前,newtestschema 下僅存在 newtesttable1 資料表。因此,newtestuser 可以存取 newtesttable1 資料表。

接下來,awsusernewtestschema 下建立另一個名為 newtesttable2 的資料表。如果 newtestusernewtestschema.newtesttable2 資料表上執行 SELECT 查詢,則會出現下列錯誤:

ERROR: permission denied for relation newtesttable2.

若要解決該錯誤,awsuser 可以執行以下步驟:

  1. 授予對 newtesttable2 資料表的存取權。若要執行此操作,awsuser 可以執行以下範例命令:

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. 授予 newtestuserawsusernewtestschema 下建立的任何未來資料表的存取權。若要執行此操作,**awsuser ** 可以執行下列範例命令:

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

    現在,當 awsusernewtestschema 下建立另一個名為 newtesttable3 的新資料表時,newtestuser 將對 newtesttable3 資料表具有 SELECT 存取權。

  3. 若要檢查是否已授予 newtestuser 預設權限,awsuser 可以執行以下查詢:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    若要檢查直接授予 newtestuser 的權限,awsuser 可以執行以下查詢:

    SELECT * from svv_relation_privileges where identity_name = 'newtestuser';

    輸出顯示,awsuser 已經授予 newtestusernewtestschema 結構描述中,所有由 awsuser 建立之新資料表的 SELECT 權限。

    schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
    newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE

相關資訊

PG_DEFAULT_ACL

AWS 官方已更新 1 年前