

# 向 SYS 对象授予 SELECT 或 EXECUTE 权限
<a name="Appendix.Oracle.CommonDBATasks.TransferPrivileges"></a>

通常，您使用可包含多个对象的角色来传输权限。要为单个对象授予权限，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.grant_sys_object`。此过程仅授予已通过角色或直接授权授予主用户的权限。

`grant_sys_object` 过程具有以下参数。

**重要**  
对于所有参数值，除非您使用区分大小写的标识符创建了用户，否则请使用大写字母。例如，如果您运行 `CREATE USER myuser` 或 `CREATE USER MYUSER`，则数据字典将存储 `MYUSER`。但是，如果您在 `CREATE USER "MyUser"` 中使用双引号，则数据字典将存储 `MyUser`。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_obj_name`  |  varchar2  |  —  |  是  |  要授予其权限的对象的名称。对象可以是目录、函数、包、过程、序列、表或视图。对象名称的拼写必须与其在 `DBA_OBJECTS` 中出现时的拼写完全相同。由于大多数系统对象都是用大写形式定义的，因此，建议您先尝试这样做。  | 
|  `p_grantee`  |  varchar2  |  —  |  是  |  要向其授予权限的对象的名称。对象可以是架构或角色。  | 
|  `p_privilege`  |  varchar2  |  null  |  是  |  —  | 
|  `p_grant_option`  |  布尔值  |  false  |  否  |  设置为 `true`，则使用 with grant option。  | 

以下示例将名为 `V_$SESSION` 的对象的 select 权限授予名为 `USER1` 的用户。

```
begin
    rdsadmin.rdsadmin_util.grant_sys_object(
        p_obj_name  => 'V_$SESSION',
        p_grantee   => 'USER1',
        p_privilege => 'SELECT');
end;
/
```

以下示例使用授予选项将名为 `V_$SESSION` 的对象的 select 权限授予名为 `USER1` 的用户。

```
begin
    rdsadmin.rdsadmin_util.grant_sys_object(
        p_obj_name     => 'V_$SESSION',
        p_grantee      => 'USER1',
        p_privilege    => 'SELECT',
        p_grant_option => true);
end;
/
```

要能够授予针对某个对象的权限，您的账户必须具有通过使用授权选项或通过使用 `with admin option` 授予的角色直接为其授予的这些权限。在最常见的情况下，您可能希望授予已授予给 `SELECT` 角色的针对 DBA 视图的 `SELECT_CATALOG_ROLE` 权限。如果尚未使用 `with admin option` 将该角色直接授予您的用户，则您将无法转让此权限。如果您具有 DBA 权限，则可直接将该角色授予其他用户。

以下示例将 `SELECT_CATALOG_ROLE` 和 `EXECUTE_CATALOG_ROLE` 授予 `USER1`。由于使用了 `with admin option`，因此，`USER1` 现在可向已获得 `SELECT_CATALOG_ROLE` 的 SYS 对象授予访问权。

```
GRANT SELECT_CATALOG_ROLE TO USER1 WITH ADMIN OPTION; 
GRANT EXECUTE_CATALOG_ROLE to USER1 WITH ADMIN OPTION;
```

无需对已获得 `PUBLIC` 的对象重新授权。如果您使用 `grant_sys_object` 过程重新授予访问权，则此过程调用将成功。