MySQL

Limitar privilegios en tablas de MySQL

MySQLEn ocasiones, necesitamos que los privilegios de la base de datos sean tan granulares que podamos restringir determinadas operaciones a nivel de tabla. En uno de nuestros proyectos actuales nos hemos encontrado con esta necesidad, y la hemos resuelto de una manera muy sencilla pero no demasiado conocida, y por ello queremos compartirla.

La definición de privilegios en MySQL comprende niveles y ámbitos. Los niveles son las bases de datos y las tablas. Los ámbitos se refieren al origen del acceso a la base de datos (local, remoto, desde una dirección IP específica, etc.).

Supongamos que tenemos una base de datos llamada documentacion, que consta de dos tablas: categorias y documentos. (Nota: la ausencia de tildes es pretendida). Además, tenemos dos usuarios con privilegios sobre la base de datos: bibliotecario y lector. Queremos que el usuario bibliotecario pueda leer y escribir en ambas tablas, y que el usuario lector sólo pueda leer. Partimos de un escenario en el que ambos usuarios tienen privilegios totales sobre la base de datos, de manera que sólo hay que restringir los del usuario lector. Usando la sentencia REVOKE, ejecutaremos lo siguiente en la consola de MySQL:

REVOKE INSERT, UPDATE, DELETE ON documentacion.* FROM 'lector'@'%'

Para verificar los privilegios actuales de un usuario, basta con ejecutar la siguiente sentencia:

SHOW GRANTS FOR 'lector'@'%'

Transacciones en MySQL con JDBC

Hoy teníamos que implementar un prototipo de importación masiva de hojas Excel a una base de datos MySQL. Se trata de una operación transaccional, pero cada sentencia de inserción o actualización se hacía efectiva en la base de datos, de manera que el rollback se hacía imposible, y un commit era inútil.

Tras una breve búsqueda, encontré este enlace, que propone usar el objeto ResultSet en lugar de lanzar directamente el statement.