2009-12-10 50 views
5

Nuestros usuarios inician sesión en la base de datos de producción como un usuario de bajo nivel, con SELECT otorgado a nivel de base de datos, e INSERT/UPDATE/DELETE otorgado en las tablas específicas a las que necesitan acceso.¿Existe alguna forma mejor de asignar permisos a tablas temporales en MySQL?

También tienen permisos para crear tablas temporales (las necesitamos para algunas de las consultas más complicadas). ¡El problema es que, si bien pueden crear las tablas temporales, no tienen acceso a INSERTARlas!

Una solución alternativa que hemos encontrado es crear una tabla "real" (¿persistente?) Del mismo nombre (pero con solo un campo) y otorgar acceso para que se inserten en eso. Luego, cuando la tabla temporal se crea con el mismo nombre, el sistema usará eso, no la tabla persistente.

mysql> CREATE TEMPORARY TABLE `testing` (`id` INTEGER AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(30)); 
Query OK, 0 rows affected (0.04 sec) 
mysql> INSERT INTO `testing` (`name`) VALUES ('testing'); 
ERROR 1142 (42000): INSERT command denied to user 'stduser'@'office.companyname.co.uk' for table 'testing' 

Si intenta conceder acceso a la tabla (en otra sesión, como root), no se puede:

mysql> GRANT INSERT ON testdb.testing TO 'stduser'@'%'; 
ERROR 1146 (42S02): Table 'testdb.testing' doesn't exist 

Así que mi pregunta es, básicamente, podemos conceder INSERT/UPDATE/¿ELIMINAR en tablas temporales sin tener una tabla "persistente" del mismo nombre dando vueltas?

Respuesta

5

De acuerdo con la MySQL reference:

MySQL le permite otorgar privilegios en bases de datos o tablas que no existe . Para las tablas, los privilegios otorgados a deben incluir el privilegio CREATE .

Por lo tanto, intente incluir el permiso CREATE en la declaración de concesión anterior.

+0

¡Acabo de probar esto en el entorno de prueba, y de hecho está en lo cierto! Es una lástima que hayas otorgado CREAR (no solo CREAR TABLAS TEMPORALES), pero muchas gracias. – Drarok

1

Las concesiones de MySQL son independientes del objeto realmente existente - puede otorgar en tablas que aún no existen y que esos permisos se asignarían a una tabla si se creara. Esto significa que puede otorgarle permiso al usuario para crear una tabla específica.

Estaría tentado de crear una base de datos solo para tablas temporales (llamada, por ejemplo, temp) y otorgar a los usuarios acceso a esa base de datos. Los permisos basados ​​en bases de datos son mucho más fáciles de administrar que los objetos por objeto.

+0

"Las concesiones de MySQL son independientes del objeto realmente existente: puede otorgar en tablas que aún no existen y esos permisos se asignarían a una tabla si se creara." No creo que sea el caso, vea el error 1146 anterior. – Drarok

4

Una forma de evitar esto será crear una base de datos especial y otorgarle al usuario acceso de escritura a ella, y luego hacer que cree esas tablas temporales en esa base de datos especial.

+0

Esto ayuda con otras soluciones como volver a abrir tablas temporales, puede crear las reales – KCD

Cuestiones relacionadas