La instrucción grant se utiliza para conceder determinados permisos genéricos o bien permisos sobre objetos a usuarios de bases de datos Oracle.
La sintaxis de GRANT para conceder permisos genéricos es la siguiente:
GRANT [privilegios_de_sistema | roles] TO [usuarios | roles |PUBLIC] {WITH GRANT OPTION }
La sintaxis de GRANT para conceder premisos sobre objetos es la siguiente:
GRANT [ALL {PRIVILEGES} | SELECT | INSERT | UPDATE | DELETE] ON objeto TO [usuario | rol | PUBLIC] {WITH GRANT OPTION}
La sintaxis de GRANT es muy sencilla, y los privilegios los puede conceder el usuario propietario de los objetos, o un usuario con privilegios de concesión de permisos sobre objetos que no son suyos (DBA's).
Lo que quería comentar es la utilización de la opción de grant WITH GRANT OPTION, que permite que el usuario al que le han concedido permisos pueda a su vez concederlos a otros usuarios.
Ejemplo de GRANT WITH GRANT OPTION
Mostraré la utilidad de esta opción con un ejemplo:
Imaginemos que tenemos un usuario 'U_VISTA', que crea una vista con una consulta que consulta información de un objeto de otro usuario 'U_DATOS'. Hasta aquí es sencillo, ya que con un GRANT del usuario 'U_DATOS' al usuario 'U_VISTA' sobre esos objetos el tema está solucionado. U_DATOS:
SQL> GRANT SELECT ON TABLA TO U_VISTA;
El problema vendría si tenemos un tercer usuario 'U_CONSULTA', que tiene que utilizar esta vista. Se podría pensar que con dar permisos de acceso a este usuario a la consulta por parte de 'U_VISTA', y permisos de acceso a los objetos que consulta la vista por parte de 'U_DATOS' ya estaría todo bien: U_VISTA:
SQL> GRANT SELECT ON VISTA TO U_CONSULTA;
U_DATOS:
SQL> GRANT SELECT ON TABLA TO U_CONSULTA;
Pues no, no es suficiente porque para acceder a estos datos a través de la vista ha de ser el propio propietario de la vista quien conceda los permisos a un tercero. Digamos que para la concesión de privilegios no se cumple la propiedad transitiva.
Para que 'U_CONSULTA' pueda trabajar sobre la VISTA sin que la base de datos le devuelva un error ORA-00942, el propietario de los objetos (o un usuario DBA) ha de conceder privilegios sobre esos objetos al otro usuario, pero con permisos para que este pueda a su vez concederlos a otros usuarios (grant with grant option):
U_DATOS:
SQL> GRANT SELECT ON TABLA TO U_VISTA WITH GRANT OPTION;
U_VISTA:
SQL> GRANT SELECT ON U_DATOS.TABLA TO U_CONSULTA; SQL> GRANT SELECT ON VISTA TO U_CONSULTA;
U_CONSULTA:
SQL> SELECT * FROM VISTA;
Y eso es todo, U_CONSULTA ya puede consultar los datos de la vista gracias a la opción WITH GRANT OPTION del GRANT.
Libros de Administración Oracle (DBA) y PL/SQL
¿Quieres profundizar más en PL/SQL de Oracle o en administración de bases de datos Oracle? Puedes hacerlo consultando alguno de estos libros de Oracle.