lunes, 23 de febrero de 2015

Concesion de Permisos sucesivos (WITH GRANT OPTION)

GRANT WITH GRANT OPTION: La propiedad transitiva en la concesión de permisos

La instrucción grant se utiliza para conceder determinados permisos genéricos o bien permisos sobre objetos a usuarios de la base de datos.
La sintaxis de la misma es la siguiente:

GRANT [privilegios_de_sistema | roles]
TO [usuarios | roles |PUBLIC] {WITH GRANT OPTION }

para conceder permisos genéricos

GRANT [ALL {PRIVILEGES} | SELECT | INSERT | UPDATE | DELETE] ON objeto
TO [usuario | rol | PUBLIC] {WITH GRANT OPTION}

para conceder permisos sobre objetos
La sintaxis 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.
Mostraré la utilizad 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 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.

No hay comentarios:

Publicar un comentario