

# Concesión de privilegios SELECT o EXECUTE para objetos SYS
<a name="Appendix.Oracle.CommonDBATasks.TransferPrivileges"></a>

Por lo general, para transferir privilegios se utilizan los roles, que pueden contener muchos objetos. Utilice el procedimiento de Amazon RDS para conceder privilegios a un solo objet `rdsadmin.rdsadmin_util.grant_sys_object`. El procedimiento solo concede los privilegios que ya haya obtenido el usuario maestro mediante un rol o una concesión directa. 

El procedimiento `grant_sys_object` tiene los siguientes parámetros. 

**importante**  
Para todos los valores de parámetros, utilice mayúsculas a no ser que haya creado el usuario con un identificador que distingue entre mayúsculas y minúsculas. Por ejemplo, si ejecuta `CREATE USER myuser` o `CREATE USER MYUSER`, el diccionario de datos almacena `MYUSER`. Sin embargo, si utiliza comillas dobles en `CREATE USER "MyUser"`, el diccionario de datos almacena `MyUser`.


****  

| Nombre del parámetro | Tipo de datos | Valor predeterminado | Obligatorio | Descripción | 
| --- | --- | --- | --- | --- | 
| `p_obj_name` | varchar2 | — | Sí | El nombre del objeto para el que se van a conceder privilegios. El objeto puede ser un directorio, una función, un paquete, un procedimiento, una secuencia, una tabla o una vista. Los nombres de los objetos deben escribirse exactamente como aparecen en `DBA_OBJECTS`. La mayoría de los objetos del sistema están definidos en mayúsculas, por lo que recomendamos que lo intente como primera opción.  | 
| `p_grantee` | varchar2 | — | Sí | El nombre del objeto al que se van a conceder privilegios. El objeto puede ser un esquema o un rol.  | 
| `p_privilege` | varchar2 | null | Sí | — | 
| `p_grant_option` | booleano | false | No | Establézcalo en `true` para usar la opción de concesión (WITH GRANT OPTION). | 

En el siguiente ejemplo se le concede el privilegio SELECT sobre el objeto `V_$SESSION` al usuario `USER1`.

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

En el siguiente ejemplo se le concede el privilegio SELECT sobre el objeto `V_$SESSION` al usuario `USER1` con la opción de concesión.

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

Para poder conceder privilegios sobre un objeto, una cuenta debe haber obtenido los privilegios directamente con la opción de concesión o a través de un rol concedido utilizando `with admin option`. En el caso más común, es posible que desee conceder `SELECT` para una vista de DBA que se haya concedido al rol `SELECT_CATALOG_ROLE`. Si a su usuario no se le ha concedido ese rol directamente utilizando `with admin option`, no podrá transferir el privilegio. Si tiene el privilegio de DBA, puede conceder el rol directamente a otro usuario. 

En el siguiente ejemplo se conceden `SELECT_CATALOG_ROLE` y `EXECUTE_CATALOG_ROLE` a `USER1`. Dado que se utiliza `with admin option`, `USER1` ahora puede conceder acceso a los objetos SYS que se hayan concedido a `SELECT_CATALOG_ROLE`. 

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

No es necesario volver a conceder los objetos que ya se han concedido a `PUBLIC`. Si utiliza el procedimiento `grant_sys_object` para volver a conceder acceso, la llamada al procedimiento se realiza correctamente. 