如何管理 Amazon RDS for Oracle 資料庫執行個體中的使用者權限和角色?
我想管理 Amazon Relational Database Service (Amazon RDS) 上適用於 Oracle 資料庫執行個體的使用者權限和角色。
簡短描述
由於 Amazon RDS 是一項受管服務,因此預設不能使用 SYS 和 SYSTEM 使用者。
如需 Amazon RDS for Oracle 資料庫授予主使用者的角色和權限清單,請參閱主使用者帳戶權限。如需 Amazon RDS for Oracle 資料庫未授予資料庫管理員 (DBA) 角色的權限清單,請參閱 Oracle DBA 權限的限制。
解決方法
**注意:**在以下區段中,將 EXAMPLE-USERNAME 替換為您要授予權限或撤銷權限的使用者名稱。
授予權限
若要授予對 SYS 物件的權限,請使用 rdsadmin.rdsadmin_util.grant_sys_object Amazon RDS 程序。此程序只會授予主使用者已擁有的權限。
若要授予使用者對 V_$SQLAREA 物件的 SELECT 權限,請以 RDS 主使用者登入。然後,執行以下命令:
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');
若要使用 grant 選項授予使用者對 V_$SQLAREA 物件的 SELECT 權限,請執行下列命令:
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT', p_grant_option => true);
**注意:**除非您使用區分大小寫的識別碼建立使用者,否則請使用大寫字母定義所有參數值。
若要將 SELECT_CATALOG_ROLE 和 EXECUTE_CATALOG_ROLE 角色授予具有 admin 選項的使用者,請執行下列命令:
SQL> GRANT SELECT_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION; SQL> GRANT EXECUTE_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION;
然後,使用者可以授予與 SELECT_CATALOG_ROLE 和 EXECUTE_CATALOG_ROLE 角色相同的 SYS 物件存取權。
若要查看與 SELECT_CATALOG_ROLE 關聯的授權,請執行下列命令:
SELECT type, owner, table_name, privilege, grantor, grantable FROM dba_tab_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') UNION SELECT 'SYS' AS type, NULL as owner, NULL as table_name, privilege, NULL, admin_option AS grantable FROM dba_sys_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') UNION SELECT 'ROLE' AS type, NULL AS owner, NULL AS table_name, granted_role AS privilege, NULL, admin_option AS grantable FROM dba_role_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') ORDER BY type, owner, table_name, privilege;
如需詳細資訊,請參閱授予 SYS 物件 SELECT 或 EXECUTE 權限。
若要撤銷單一物件的權限,請使用 rdsadmin.rdsadmin_util.revoke_sys_object RDS 程序。
若要撤銷使用者對 V_$SQLAREA 的 SELECT 權限,請執行下列命令:
EXECUTE rdsadmin.rdsadmin_util.revoke_sys_object( p_obj_name => 'V_$SQLAREA', p_revokee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');
如需詳細資訊,請參閱撤銷 SYS 物件的 SELECT 或 EXECUTE 權限。
重設主使用者權限
如果您已撤銷主使用者的角色和權限,則可以將其重設。如需詳細資訊,請參閱如何重設 Amazon RDS 資料庫執行個體的管理員使用者密碼?
授予主使用者 RDS_MASTER_ROLE
您無法將 RDS_MASTER_ROLE 角色授予非主使用者。建立資料庫執行個體時,SYS 預設會建立 RDS_MASTER_ROLE。您只能授予主使用者 RDS_MASTER_ROLE。若要列出您已授予 RDS_MASTER_ROLE 權限的使用者,請執行下列命令:
SQL> SELECT * FROM sys.dba_role_privs WHERE granted_role = 'RDS_MASTER_ROLE';
輸出範例:
GRANTEE GRANTED_ROLE ADM DEL DEF COM INH-------- --------------- --- --- --- --- --- MASTER RDS_MASTER_ROLE NO NO YES NO NO SYS RDS_MASTER_ROLE YES NO YES YES YES
由於主使用者沒有管理員選項,因此您無法將 RDS_MASTER_ROLE 授予任何其他使用者。如需詳細資訊,請參閱向非主使用者授予權限。
撤銷關鍵 DBMS_* 和 UTL_* 套件的 PUBLIC 角色權限
撤銷關鍵 DBMS_* 和 UTL_* 套件的 PUBLIC 角色權限並不是最佳實務,因為多個 Oracle 應用程式依賴這些權限。關鍵的 DBMS_* 和 UTL_* 套件包括 UTL_TCP、UTL_HTTP、HTTPURITYPE、UTL_INADDR、UTL_SMTP、DBMS_LDAP、DBMS_LOB、UTL_FILE、DBMS_ADVISOR、DBMS_OBFUSCATION_TOOLKIT、DBMS_BACKUP_RESTORE,以及 DBMS_SYS_SQL。
解決使用密碼建立角色時出現的 "invalid schema" (無效結構描述) 錯誤
例如,您使用 rdsadmin_util.grant_sys_object 建立包含密碼的角色,並在下列命令中授予權限:
SQL> CREATE ROLE ROLE_NAME IDENTIFIED BY EXAMPLE-PASSWORD; SQL> EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBMS_JOB', 'ROLE_NAME');
在命令的輸出中,您會收到以下錯誤:
"ORA-20199: Error in rdsadmin_util.grant_sys_object.ORA-44001: invalid schema
ORA-06512: at \"RDSADMIN.RDSADMIN_UTIL", line 268
ORA-44001: invalid schema"
若要解決此問題,請執行以下命令以建立不包密碼的角色:
SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;
解決 "ORA-01031: insufficient privileges" (ORA-01031:權限不足) 錯誤
以下是可能導致 ORA-01031 錯誤的範例案例。
您執行 ALTER SYSTEM SET 命令
執行以下命令時出現 ORA-01031 錯誤:
SQL> ALTER SYSTEM SET processes=200 scope=spfile;
您無法變更預設資料庫參數群組中的參數值。改為修改自訂資料庫參數群組中的參數值。
您使用資料庫觸發程序,並且對底層資料表結構的變更導致觸發程序狀態變為「無效」
下次事件釋放觸發程序時,觸發程序的隱式編譯將失敗,並出現以下錯誤:
"ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIGORA-01031: insufficient privileges"
若要解決此問題,請執行下列命令,明確授予觸發程序擁有者管理資料庫觸發程序權限,以便擁有者可以修改資料庫觸發程序:
SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner; SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE;
預期輸出:
Trigger altered.
您執行預存程序
您會收到 "ORA-01031" 錯誤,是因為在以定義者權限執行的具名預存程序中,無法使用從角色取得的權限。改用您從 SQL Plus 和匿名 PL/SQL 區塊中的角色所獲得的權限。
以下預存程序會失敗,因為使用者使用具名預存程序中的角色權限來建立資料表。然後使用者刪除該資料表,並嘗試使用預存程序建立相同的資料表:
SQL> CREATE USER EXAMPLE-USERNAME IDENTIFIED BY EXAMPLE-PASSWORD; SQL> GRANT connect, resource TO EXAMPLE-USERNAME SQL> CREATE TABLE dept (deptno NUMBER, deptname VARCHAR2(30)); Table DEPT created.SQL> DROP table DEPT; SQL> CREATE OR REPLACE PROCEDURE test_proc AS BEGIN EXECUTE IMMEDIATE 'CREATE TABLE DEPT (DeptNo number, DeptName varchar2(30))'; END; / Procedure TEST_PROC created SQL> EXEC TEST_PROC
輸出顯示以下錯誤:
"Error report -ORA-01031: insufficient privileges"
若要解決此問題,請以主使用者身分連線,然後執行以下命令授予 CREATE TABLE 權限:
SQL> GRANT CREATE TABLE TO test_user;
執行以下命令來執行預存程序:
SQL> EXEC TEST_PROC
預期輸出:
PL/SQL procedure successfully completed.
您沒有使用授權選項授予主使用者權限
當您沒有使用物件的授予選項授予主使用者權限時,就會出現 "ORA-04043" 錯誤。
以下範例授權程序會失敗,因為主使用者不具備 DBA_TABLESPACE_USAGE_METRICS 物件上的 SELECT 權限 (含授權選項):
SQL> SHOW USER; USER is \"EXAMPLE-USERNAME\" SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;
輸出顯示 "ERROR: ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist" 錯誤訊息。
當主使用者嘗試向其他使用者授予對 DBA_TABLESPACE_USAGE_METRICS 物件的 SELECT 權限時,主使用者會收到 "ORA-01031: insufficient privileges" (ORA-01031:權限不足) 錯誤。
若要解決此問題,請執行下列命令,使用 grant option 明確授予主使用者 SELECT 權限:
SQL> EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'DBA_TABLESPACE_USAGE_METRICS', p_grantee => 'ADMIN', p_privilege => 'SELECT', p_grant_option => true); SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME;
授予 SELECT 權限後,主使用者即可成功執行 SELECT 命令:
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;
相關資訊
在 Oracle 網站上設定權限和角色授權
相關內容
已提問 3 年前
已提問 1 年前

