Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何管理我的 Amazon RDS for Oracle 数据库实例中的用户权限和角色?
我想管理我的 Amazon Relational Database Service (Amazon RDS) for 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');
要向用户授予对于 V_$SQLAREA 对象包含 grant 选项的 SELECT 权限,请运行以下命令:
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT', p_grant_option => true);
**注意:**除非您在创建用户时使用了区分大小写的标识符,否则请使用大写来定义所有参数值。
要向用户授予包含 admin 选项的 SELECT_CATALOG_ROLE 和 EXECUTE_CATALOG_ROLE 角色,请运行以下命令:
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 过程。
要撤销用户对 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
由于主用户不具备 admin 选项,因此您无法向任何其他用户授予 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 错误的示例使用案例。
您运行了 ALTER SYSTEM SET 命令
当您运行以下命令时,将会出现 ORA-01031 错误:
SQL> ALTER SYSTEM SET processes=200 scope=spfile;
您无法更改默认数据库参数组中的参数值。相反,请修改自定义数据库参数组中的参数值。
您使用了数据库触发器,且您对基础表结构的更改导致触发器状态更改为 INVALID
下次事件触发该触发器时,触发器的隐式编译会失败,并显示以下错误:
“ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIGORA-01031: insufficient privileges”
要解决此问题,请运行以下命令,以向触发器的所有者显式授予 administer database trigger 权限,以便所有者能够修改数据库触发器:
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.
您未向主用户授予包含 grant 选项的权限
当您未向主用户授予包含 grant 选项的对象权限时,将会出现“ORA-04043”错误。
以下示例授权过程将失败,因为主用户对于 DBA_TABLESPACE_USAGE_METRICS 对象不具备包含 grant 选项的 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”错误。
要解决此问题,请运行以下命令,以向主用户显式授予包含 grant 选项的 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 网站上的配置权限和角色授权

