Mariadb 레거시 지원

Mariadb 레거시 지원

SQL 쿼리에서 이스케이프 처리되지 않은 'row_number' 열 번호를 사용하는 이전 버전의 PHP 사이트가 있습니다. mariadb의 새 버전에는 "row_number()"라는 새 함수가 추가되어 쿼리가 실패하는 것 같습니다. 전체 프로젝트를 리팩토링하는 것은 불가능합니다. 또한 이전 버전의 mariadb로 모든 것을 도킹하고 싶지 않습니다. 새로운 mariadb를 사용하면서도 이전 구문/함수 세트를 사용하여 충돌이 발생하지 않도록 하는 방법이 있습니까?

감사해요.

답변1

Linux(또는 유사)에서는 단일 명령으로 모든 파일에 백틱을 추가할 수 있습니다.

주의: 철저한 테스트 없이 먼저 사용하지 마십시오.

sed  -i  's/row_number/\`row_number\`/ig  *

노트:

-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

답변2

이러한 종류의 문제를 해결하는 한 가지 방법은 다음을 사용하는 것입니다.정규식 필터MariaDB MaxScale에서. 응용 프로그램이 특정 방식으로 이름을 사용한다는 것을 알고 있는 경우 ROW_NUMBER해당 이름과 일치하는 정규식을 정의하고 인용된 버전으로 바꿀 수 있습니다.

이 접근 방식의 명백한 단점은 정규식을 올바르게 작성하기가 다소 까다롭고 일치하는 패턴이 복잡해지면 유지 관리가 쉽지 않다는 것입니다. 그러나 이렇게 하면 애플리케이션을 최신 버전으로 업데이트하는 동안 애플리케이션이 작동할 수 있습니다.

필터 구성 방법의 예는 다음과 같습니다.

[RegexFilter]
type=filter
module=regexfilter
match=/ROW_NUMBER/
replace=/`ROW_NUMBER`/

답변3

또한 이전 버전의 mariadb로 모든 것을 도킹하고 싶지 않습니다.

좋은. 이전 버전을 무기한 사용하는 것은 대부분의 사람들이 생각하는 것보다 더 많은 작업입니다. 보안 업데이트가 종료되면 수정 사항을 백포트할 수 있는 사람으로부터 지원을 구매하는 등의 대안을 찾아야 합니다. 찾아보기 힘든 스킬이네요. 그러면 이전 버전에 갇혀서 새로운 기능을 얻을 수 없습니다.

새로운 mariadb를 사용하면서도 이전 구문/함수 세트를 사용하여 충돌이 발생하지 않도록 하는 방법이 있습니까?

아니요, row_number는 다음을 수행하는 창 함수입니다.지원되는 모든 버전의 MariaDB에 존재합니다.. 이름을 먼저 선택한 것은 유감스럽지만 row_number는 SQL 구현 간의 관례입니다.

인용은 당신이 말했듯이 모호성을 해결하는 하나의 구문입니다. 이는 상대적으로 사소한 리팩토링 프로젝트이므로 동작 변경이 없으며 데이터나 스키마를 건드릴 필요도 없습니다. 사이트 개발자가 이를 수행하지 않는다면 코드가 얻을 수 없는 또 다른 복잡한 유지 관리는 무엇입니까?

관련 정보