Tengo una versión anterior del sitio php, que utiliza el número de columna 'número_fila' sin escape en sus consultas SQL. Parece que en la nueva versión de mariadb se ha agregado una nueva función llamada "row_number()" y, por lo tanto, las consultas fallan. Refactorizar todo el proyecto está fuera de discusión. Además, no quiero acoplar todo con una versión anterior de mariadb. ¿Hay alguna forma de utilizar el nuevo mariadb pero también utilizar un conjunto de funciones/sintaxis anterior para que no haya colisiones?
Gracias.
Respuesta1
En Linux (o similar), un solo comando puede agregar los backtics en todos sus archivos.
Precaución: No utilice esto sin realizar una prueba exhaustiva primero:
sed -i 's/row_number/\`row_number\`/ig *
Notas:
-i -- update file in-place
\ -- need to avoid the backtics being acted on by the shell
i -- ignore case
g -- handle multiple occurrences in a line
* -- change to specify the files that might need editing
Respuesta2
Una forma de solucionar este tipo de problemas es utilizarel filtro de expresión regularen MariaDB MaxScale. Si sabe que la aplicación usa el ROW_NUMBER
nombre de alguna manera específica, puede definir una expresión regular que coincida con él y lo reemplace con la versión citada.
La desventaja obvia de este enfoque es que las expresiones regulares son algo difíciles de hacer correctamente y no son fáciles de mantener si el patrón que debe coincidir se vuelve complejo. Sin embargo, esto podría permitir que su aplicación funcione mientras usted trabaja en actualizarla a una versión más nueva.
A continuación se muestra un ejemplo de cómo se configuraría el filtro:
[RegexFilter]
type=filter
module=regexfilter
match=/ROW_NUMBER/
replace=/`ROW_NUMBER`/
Respuesta3
Además, no quiero acoplar todo con una versión anterior de mariadb.
Bien. Usar versiones antiguas indefinidamente es más trabajo de lo que la mayoría de la gente cree. Las actualizaciones de seguridad finalizarán, necesitarás encontrar una alternativa como comprar soporte de alguien que pueda soportar correcciones. Lo cual es una habilidad difícil de encontrar. Y luego te quedas atascado en una versión anterior y no obtienes nuevas funciones.
¿Hay alguna forma de utilizar el nuevo mariadb pero también utilizar un conjunto de funciones/sintaxis anterior para que no haya colisiones?
No, número_fila es una función de ventana queexiste en todas las versiones compatibles de MariaDB. Es una pena que haya elegido el nombre primero, pero número_fila es una convención entre las implementaciones de SQL.
Citar es una sintaxis para resolver la ambigüedad, como dijiste. Este sería un proyecto de refactorización relativamente menor, sin cambios de comportamiento y sin necesidad de tocar datos o esquemas. Si los desarrolladores de su sitio no lo hacen, ¿qué otro mantenimiento más complejo no recibe el código?