

# 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. 