En ocasiones queremos que un usuario (o un rol) tenga todos los derechos sobre una Base de Datos aunque sin ser el SYSDBA de ella ni tener el rol RDB$ADMIN. O quizás lo que necesitamos es que tenga la mayoría de los derechos, aunque no todos.

Para este último caso lo que podríamos hacer es otorgarle todos los derechos y luego quitarle algunos de ellos, para que él tenga solamente los derechos que nosotros queremos que tenga.

Tenemos dos formas de conseguir nuestro objetivo:

  1. La forma lenta
  2. La forma rápida

La forma lenta es por cada tabla, por cada vista y por cada stored procedure otorgarle el derecho correspondiente. Desde luego que si las tablas, vistas y stored procedures se cuentan por decenas o por centenas hacer algo así será terriblemente aburrido y una gran pérdida de tiempo que podríamos aprovechar haciendo algo más productivo.

La forma rápida es a través de un stored procedure como el siguiente:

CREATE PROCEDURE SP_GRANT_ALL_TO(
   tcNombreUsuario VARCHAR(31))
AS
   DECLARE VARIABLE tcObjeto VARCHAR(31);
BEGIN

   -- Se otorga derechos sobre las tablas y sobre las vistas

   FOR SELECT
      RDB$RELATION_NAME
   FROM
      RDB$RELATIONS
   WHERE
      RDB$SYSTEM_FLAG = 0
   INTO
      :tcObjeto
   DO
      EXECUTE STATEMENT 'GRANT ALL ON ' || tcObjeto || ' TO ' || tcNombreUsuario;

   -- Se otorga derechos sobre los stored procedures

   FOR SELECT
      RDB$PROCEDURE_NAME
   FROM
      RDB$PROCEDURES
   WHERE
      RDB$SYSTEM_FLAG = 0
   INTO
      :tcObjeto
   DO
      EXECUTE STATEMENT 'GRANT EXECUTE ON PROCEDURE ' || tcObjeto || ' TO ' || tcNombreUsuario;

END;

 Este stored procedure le otorga al usuario o al rol cuyo nombre introducimos todos los derechos sobre todas las tablas, sobre todas las vistas y sobre todos los stored procedures de nuestra Base de Datos. Lo llamaríamos así:


EXECUTE PROCEDURE SP_GRANT_ALL_TO('MARCELA');

EXECUTE PROCEDURE SP_GRANT_ALL_TO('R_CONTABILIDAD');

COMMIT;

Y cuando el usuario MARCELA o alguien que pertenezca al rol R_CONTABILIDAD vuelva a conectarse a la Base de Datos, tendrá acceso a todas las tablas, todas las vistas y todos los stored procedures.

Conclusión:

Otorgar los derechos (también llamados permisos o privilegios) a cada tabla, cada vista, y cada stored procedure puede ser extremadamente tedioso, sobre todo cuando los objetos no son dos o tres sino decenas o centenas. Evidentemente que lo más inteligente es tener un stored procedure que se encargue de esa tarea por nosotros.

El stored procedure aquí mostrado cumple con esa tarea, aunque desde luego que podría ser mejorado o adaptado a tus particulares circunstancias. Por ejemplo podrías agregarle WITH GRANT OPTION, o podrías colocar un IF …. THEN para que algunos objetos sean salteados y no se otorgue permisos sobre ellos, algo como:

IF (tcObjeto <> 'CONFIGURACION') THEN
   EXECUTE STATEMENT 'GRANT ALL ON ' || tcObjeto || ' TO ' || tcNombreUsuario;

Aquí, si la tabla se llama CONFIGURACION entonces el usuario no recibe derechos en esa tabla. Recibe derechos sobre todas las otras tablas, pero no sobre la tabla CONFIGURACION. Eso puede ser lo más adecuado para evitar que meta sus pezuñas donde no debe.

Otro método es usar el comando REVOKE para quitarle derechos que anteriormente se le habían otorgado. Sería algo como:

REVOKE ALL ON CONFIGURACION FROM MARCELA

Tanto usando IF … THEN como usando REVOKE ALL, se consigue el objetivo buscado, o sea que el usuario MARCELA no tenga derechos sobre la tabla CONFIGURACION.

Ya tú decidirás cual te resulta más conveniente usar.

Advertencia:

El hecho de que PUEDAS fácilmente otorgarle todos los derechos sobre todos los objetos a un usuario usando un stored procedure como el aquí mostrado no significa que DEBAS hacerlo. La seguridad y la integridad de tu Base de Datos siempre debe ser tu principal prioridad; tu comodidad o la comodidad de los usuarios, debe estar después.

Muchas veces lo preferible es que crees un rol (o varios roles) y uno (o varios) archivos de script para el otorgamiento de derechos. Eso tiene la ventaja de que te sirve como documentación (ya que en tu archivo de script puedes escribir todos los comentarios que desees) y que con simples “copiar y pegar” puedes rápidamente tener muchos archivos de script, cada uno de ellos otorgando o revocando derechos.

Por lo tanto, el stored procedure anteriormente mostrado puede ser muy útil pero siempre deberías verificar que no estás otorgando más derechos de los que deberías otorgar.

Artículos relacionados:

Entendiendo los derechos de acceso

Otorgando permisos con EMS SQL Manager

Delegando el otorgamiento de derechos

El índice del blog Firebird21

 

Anuncios