Ich habe eine alte Version einer PHP-Site, die in ihren SQL-Abfragen die nicht maskierte Spaltennummer „row_number“ verwendet. Es scheint, dass in der neuen Version von MariaDB eine neue Funktion namens „row_number()“ hinzugefügt wurde und die Abfragen daher fehlschlagen. Eine Umstrukturierung des gesamten Projekts kommt nicht in Frage. Außerdem möchte ich das Ganze nicht mit einer älteren Version von MariaDB dockerisieren. Gibt es eine Möglichkeit, das neue MariaDB zu verwenden, aber auch die ältere Syntax/den älteren Funktionssatz, sodass es zu keinen Kollisionen kommt?
Danke.
Antwort1
Unter Linux (oder ähnlichen Betriebssystemen) können Sie mit einem einzigen Befehl die Backtics in alle Ihre Dateien einfügen.
Achtung: Verwenden Sie dies nicht ohne vorherige gründliche Tests:
sed -i 's/row_number/\`row_number\`/ig *
Anmerkungen:
-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
Antwort2
Eine Möglichkeit, diese Art von Problemen zu umgehen, ist die Verwendung vonder reguläre Ausdrucksfilterin MariaDB MaxScale. Wenn Sie wissen, dass die Anwendung den ROW_NUMBER
Namen auf eine bestimmte Weise verwendet, können Sie einen regulären Ausdruck definieren, der damit übereinstimmt und ihn durch die in Anführungszeichen gesetzte Version ersetzt.
Der offensichtliche Nachteil dieses Ansatzes besteht darin, dass es etwas schwierig ist, reguläre Ausdrücke richtig zu verwenden, und dass sie nicht leicht zu pflegen sind, wenn das abzugleichende Muster komplex wird. Auf diese Weise kann Ihre Anwendung jedoch möglicherweise weiter funktionieren, während Sie daran arbeiten, Ihre Anwendung auf eine neuere Version zu aktualisieren.
Hier ist ein Beispiel für die Konfiguration des Filters:
[RegexFilter]
type=filter
module=regexfilter
match=/ROW_NUMBER/
replace=/`ROW_NUMBER`/
Antwort3
Außerdem möchte ich das Ganze nicht mit einer älteren Version von MariaDB dockerisieren.
Gut. Alte Versionen auf unbestimmte Zeit zu verwenden, ist mehr Arbeit, als den meisten Leuten bewusst ist. Sicherheitsupdates werden irgendwann nicht mehr verfügbar sein, Sie müssen eine Alternative finden, z. B. Support von jemandem kaufen, der Fixes zurückportieren kann. Das ist eine schwer zu findende Fähigkeit. Und dann bleiben Sie bei einer alten Version hängen und erhalten keine neuen Funktionen.
Gibt es eine Möglichkeit, das neue MariaDB und gleichzeitig die ältere Syntax/den älteren Funktionssatz zu verwenden, sodass es zu keinen Kollisionen kommt?
Nein, row_number ist eine Fensterfunktion, dieexistiert in allen unterstützten Versionen von MariaDB. Schade, dass Sie zuerst den Namen ausgewählt haben, aber row_number ist eine Konvention bei SQL-Implementierungen.
Wie Sie sagten, ist Anführungszeichen eine Syntax, um die Mehrdeutigkeit aufzulösen. Dies wäre ein relativ kleines Refactoring-Projekt, keine Verhaltensänderung und keine Notwendigkeit, Daten oder Schemata zu berühren. Wenn die Entwickler Ihrer Site dies nicht tun, welche andere komplexere Wartung wird der Code dann nicht erhalten?