Be a happy coder

You are here

Importando vistas entre bases de datos MySQL

11 Jun 2012

La operación habitual al pasar un sistema desde desarrollo a producción (o preproducción). Volcamos la información de la base de datos en un fichero en el servidor origen, la agregamos desde ese fichero en el servidor destino y listo. Oops, parece que no, algo no va bien. Nuestras vistas de bbdd no están funcionando, ¿por qué?

Entro directamente por la consola de MySQL y compruebo que es lo que está pasando:

mysql> select * from civicrm_uf_group_es_ES;
ERROR 1356 (HY000): View 'vsfcrm.civicrm_uf_group_es_ES' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

Vale, está claro que se está quejando de una vista a la que no puede acceder, sin embargo compruebo que la vista existe, se ha creado correctamente al importar los datos. Con un usuario con privilegios si consigo acceder, por lo que parece un problema de permisos.

Volvamos un poco más atrás. He volcado la información de mi bbdd de desarrollo en un fichero .sql utilizando mysqldump, veamos como ha definido la vista:

[...]
--
-- Temporary table structure for view `civicrm_uf_group_es_ES`
--
DROP TABLE IF EXISTS `civicrm_uf_group_es_ES`;
/*!50001 DROP VIEW IF EXISTS `civicrm_uf_group_es_ES`*/;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `civicrm_uf_group_es_ES` (
  `id` int(10) unsigned,

[...]

--
-- Final view structure for view `civicrm_uf_group_es_ES`
--
/*!50001 DROP TABLE IF EXISTS `civicrm_uf_group_es_ES`*/;
/*!50001 DROP VIEW IF EXISTS `civicrm_uf_group_es_ES`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8 */;
/*!50001 SET character_set_results = utf8 */;
/*!50001 SET collation_connection = utf8_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`vsfcivicrm`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `civicrm_uf_group_es_ES` AS select `civicrm_uf_group`.`id` AS `id`,`civicrm_uf_group`.`is_active` AS `is_active`,

[...]

Ahora lo veo claro, la línea

/*!50013 DEFINER=`vsfcivicrm`@`localhost` SQL SECURITY DEFINER */

indica que la vista se debe ejecutar con el nivel de permisos de seguridad del usuario `vsfcivicrm`, pero como resulta que en el sistema destino, otro servidor diferente en donde estoy instalando esta base de datos, no tiene ese usuario sino uno diferente `vsfcrm` y que tiene los mismos permisos, respecto a lo que son tablas no hay problema pero las vistas es otro tema. Cuando funcionas con SQL SECURITY DEFINER, la vista funciona con los privilegios de DEFINER (como un set-uid en UNIX). Como en mi caso el usuario no existe, esto es un problema.

La solución más sencilla es quitar esa línea, ya que parece que no hay forma de evitar que esa línea termine en el fichero de volcado de la bbdd. En mi caso, la quito borrándola del fichero generado:

sed ‘/^\/\*\!50013/d’ backup.sql > backup_limpio_50013.sql

Y al importar de nuevo utilizando el fichero modificado, volvemos a comprobar y ya todo funciona como debería.

Etiquetas: