Entendiendo los derechos de acceso

9 comentarios

En este artículo hemos visto como agregar usuarios, borrar usuarios, y cambiarles la contraseña:

https://firebird21.wordpress.com/2013/04/21/agregando-modificando-y-borrando-usuarios/

Esas personas podrán acceder a la Base de Datos pero aún no podrán realizar alguna operación en ella, ni siquiera una consulta. El Firebird por defecto les impide que ejecuten los comandos INSERT, UPDATE, DELETE, SELECT, EXECUTE PROCEDURE.

¿Por qué eso?

Porque para mantener el acceso y la utilización de la Base de Datos seguros los usuarios deben tener permisos solamente a las operaciones que específicamente se les hayan otorgado. Si no se les otorgó el permiso para realizar una operación, no podrán realizar esa operación.

Por ejemplo, a los vendedores no se les otorga el permiso para modificar los precios de venta de los productos; a los empleados no se les otorga el permiso para cambiar su propio sueldo; a los contadores no se les otorga el permiso de cambiar los datos de una venta; etc.

Si intentan realizar una operación a la cual no tienen permiso, el Firebird lo impedirá.

¿Qué es un rol?

Es el nombre otorgado a un grupo de usuarios que tienen exactamente los mismos permisos. Por ejemplo, se podría tener un rol llamado R_VENDEDORES en el cual se especificarán los permisos que poseen las personas que tienen ese rol. Todas las personas cuyo rol sea R_VENDEDORES tendrán esos permisos pero ninguno más. A los miembros de este rol se les podrían otorgar el permiso de insertar ventas (pero no modificarlas ni borrarlas), el permiso de consultar las cantidades en stock y los precios de venta de los productos (pero no insertar ni modificar ni borrar los datos de los productos). A los miembros de este rol no se les permitirá ver las compras ni las cobranzas ni los pagos ni los sueldos ni las comisiones de otros vendedores ni muchas otras cosas más.

¿Cómo se crea un rol?

Con el comando CREATE ROLE NombreRol

¿Cómo se elimina un rol?

Con el comando DROP ROLE NombreRol

¿Cuál es el comando usado para otorgarles permisos a los usuarios y a los roles?

El comando se llama GRANT (conceder, otorgar, en castellano) y su sintaxis es la siguiente:

GRANT
{<permisos> ON <objeto> | rol}
TO <concedido>
[WITH {GRANT|ADMIN} OPTION]
[{GRANTED BY | AS} [USER] otorgador]

¿Cuáles son los permisos que se pueden otorgar?

SELECT
Consultar datos
INSERT
Agregar nuevas filas
UPDATE
Modificar datos existentes
DELETE
Borrar filas
REFERENCES
Referirse a una Primary Key desde una Foreign Key. Siempre se debe 
otorgar este permiso para que puedan seleccionarse las columnas de 
la tabla referida.

ALL
Todos los anteriores

EXECUTE
Ejecuta un stored procedure o lo llama usando SELECT cuando se 
trata de un stored procedure seleccionable

ROLE
Adquiere todos los privilegios otorgados al rol. Una vez que un 
rol existe y se le han otorgado permisos, se convierte en un 
permiso que se les puede otorgar a los usuarios.

¿Qué significa WITH GRANT OPTION?

Que el usuario a quien se le otorgó ese permiso tiene el derecho de otorgarles ese mismo permiso a otros usuarios.

¿Cómo se quita un permiso?

 Con el comando REVOKE.

REVOKE <permisos>

ON <objeto>

FROM <revocado>

 Ejemplo 1. Otorgando el permiso de hacer SELECT a la tabla PRODUCTOS al usuario ALICIA

GRANT SELECT ON PRODUCTOS TO ALICIA

Ejemplo 2. Otorgando los permisos de SELECT y de INSERT y de UPDATE a la tabla PRODUCTOS al usuario SUSANA

GRANT INSERT, UPDATE, SELECT ON PRODUCTOS TO SUSANA

Ejemplo 3. Otorgando todos los permisos a la tabla PRODUCTOS al usuario GRACIELA

GRANT ALL ON PRODUCTOS TO GRACIELA

Ejemplo 4. Otorgando el permiso de cambiar el Código de Barras y el Precio de Venta de los productos al usuario INES

GRANT UPDATE (PRD_CODBAR, PRD_PREVTA) ON PRODUCTOS TO INES

Ejemplo 5. Otorgando el permiso de ejecutar el stored procedure GRABAR_PRODUCTO al usuario RAQUEL

GRANT EXECUTE ON PROCEDURE GRABAR_PRODUCTO TO RAQUEL

Ejemplo 6. Recibiendo y otorgando el permiso de hacer SELECT a la tabla PRODUCTOS

GRANT SELECT ON PRODUCTOS TO SILVIA WITH GRANT OPTION

Y ahora Silvia puede escribir:

GRANT SELECT ON PRODUCTOS TO MARCELA

GRANT SELECT ON PRODUCTOS TO LUCIANA WITH GRANT OPTION

Ejemplo 7. Otorgando permisos a un stored procedure

GRANT INSERT, UPDATE ON PRODUCTOS TO PROCEDURE GRABAR_PRODUCTO

En este ejemplo al stored procedure GRABAR_PRODUCTO se le otorgó el permiso de INSERT y de UPDATE a la tabla PRODUCTOS. Eso significa que si un usuario tiene el permiso de ejecutar el stored procedure también tendrá el permiso se insertar y de actualizar la tabla respectiva. Si no se hace así entonces habrá que asignarle a cada usuario individualmente (y a cada rol individualmente) los derechos de insertar y de actualizar la tabla, y eso llevaría mucho más tiempo.

GRANT ALL ON PRODUCTOS TO PROCEDURE RECALCULAR_SALDOS

En este ejemplo al stored procedure RECALCULAR_SALDOS se le otorgaron todos los permisos sobre la tabla PRODUCTOS. O sea que dentro de ese stored procedure se puede insertar, modificar, borrar, seleccionar datos y referenciar tablas.

Ejemplo 8. Otorgando los permisos a varios usuarios a la vez

GRANT SELECT ON PAISES TO ALICIA, GRACIELA, SILVIA, SUSANA

Estos cuatro usuarios podrán realizar consultas a la tabla PAISES

Ejemplo 9. Creando roles

CREATE ROLE R_ADMINISTRACION

CREATE ROLE R_VENDEDORES

(El nombre del rol no tiene por qué empezar con R_, esa es solamente una costumbre del autor de este blog, si quieres a tu rol lo puedes llamar: ADMINISTRACION, CONTADORES, VENDEDORES, etc., pero si el nombre empieza con R_ es más fácil saber que se trata de un rol)

Ejemplo 10. Otorgándole permisos al rol

GRANT UPDATE(PRD_PREVTA) ON PRODUCTOS TO R_ADMINISTRACION

GRANT INSERT, SELECT ON PRODUCTOS TO R_VENDEDORES

Ejemplo 11. Quitándole el permiso de hacer SELECT a la tabla PRODUCTOS al usuario ALICIA

REVOKE SELECT ON PRODUCTOS FROM ALICIA

Ejemplo 12. Quitándole todos los permisos a la tabla PRODUCTOS al usuario SUSANA

REVOKE ALL ON PRODUCTOS FROM SUSANA

Ejemplo 13. Quitándole el derecho de ejecutar el stored procedure GRABAR_PRODUCTO al usuario RAQUEL

REVOKE EXECUTE ON PROCEDURE GRABAR_PRODUCTO FROM RAQUEL

Ejemplo 14. Quitándole el derecho de otorgar permisos al usuario SILVIA

REVOKE GRANT OPTION FOR SELECT ON PRODUCTOS FROM SILVIA

Artículo relacionado:

El índice del blog Firebird21

 

Usando un script para insertar datos fijos

1 comentario

Muchas veces en nuestra Base de Datos tenemos tablas cuyas filas son fijas, por ejemplo: Estados, Provincias, Departamentos, Localidades, Bancos, Tarjetas de Crédito, etc.

Cuando trabajamos con la Base de Datos en nuestra computadora, lo normal es que agreguemos, modifiquemos y borremos un montón de filas mientras hacemos las pruebas que nos aseguren que está todo bien.

Después, cuando copiamos la Base de Datos con la cual estuvimos trabajando en la computadora del usuario: ¿cómo sabemos que los datos de todas esas tablas sean los correctos? Con tantas inserciones, modificaciones y borrados que estuvimos haciendo no podríamos asegurarlo así que una alternativa es revisar las tablas, una por una, y ponerles los valores correctos.

Eso funciona, pero es lento. En una aplicación grande tendrías cientos de tablas y si cada vez que empiezas a trabajar con ellas debes volver a verificarlas perderás muchísimo tiempo.

Hay una mejor alternativa: creando scripts que se encarguen de esa tarea.

Ejemplo. Creando un script para insertar tarjetas de crédito

En este ejemplo creamos un script que se encargará de llenar la tabla TARJETAS con las filas correspondientes. Para asegurarnos que esta tabla tiene las filas correctas solamente debemos ejecutar el script.

Listado 1.

DELETE FROM TARJETAS;

COMMIT;

SET GENERATOR TARJETAS_TAR_IDENTI_GEN TO 0;

COMMIT;

INSERT INTO TARJETAS VALUES(0, 'AMERICAN EXPRESS');
INSERT INTO TARJETAS VALUES(0, 'MASTERCARD');
INSERT INTO TARJETAS VALUES(0, 'VISA');

COMMIT;

Aquí, primero eliminamos todas las filas de la tabla TARJETAS, luego inicializamos el generador de la Primary Key a cero, a continuación le insertamos todas las filas que deseamos, finalmente escribimos el COMMIT para que los datos queden grabados permanentemente.

Por lo tanto, si ejecutamos este script en la Base de Datos que se encuentra en el Servidor del usuario la tabla TARJETAS tendrá todos sus valores correctos.

Y desde luego, así como hicimos con la tabla TARJETAS también haríamos con todas las demás tablas cuyos datos son fijos.

Artículos relacionados:

Entendiendo a los scripts

Usando scripts para documentar la Base de Datos

Ejecutando un script desde Visual FoxPro

El índice del blog Firebird21

El foro del blog Firebird21