programing

.sql 파일에서 SQL 구문을 확인하려면 어떻게 해야 합니까?

javamemo 2023. 11. 6. 21:36
반응형

.sql 파일에서 SQL 구문을 확인하려면 어떻게 해야 합니까?

.sql 파일에서 SQL 구문을 확인하려면 어떻게 해야 합니까?

SELECT STATEMENT_DIGEST_TEXTMySQL 8.0에서 MySQL 쿼리 구문 검증에 사용할 수 있습니다.

8.0.4>SELECT STATEMENT_DIGEST_TEXT('FLUSH TABLES')\G
STATEMENT_DIGEST_TEXT('FLUSH TABLES'): FLUSH TABLES 

8.0.4>SELECT STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;")\G
STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;"): SET GLOBAL `second_cache` . `key_buffer_size` = ? * ? ;

8.0.4>SELECT STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;")\G
STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;"): CREATE TABLE `t1` ( `a2` INTEGER UNSIGNED NOT NULL , `b2` INTEGER UNSIGNED NOT NULL , `c2` INTEGER UNSIGNED NOT NULL , PRIMARY KEY ( `a2` ) , INDEX `b2x` ( `b2` ) , INDEX `c2x` ( `c2` ) ) ENGINE = MEMORY ; 

SQL이 지원되지 않으면 오류가 발생합니다.다음과 마찬가지로, 하지만 이 반응에는 특별한 점이 있습니다.

8.0.4>SELECT STATEMENT_DIGEST_TEXT('HELP SELECT')\G
ERROR 3676 (HY000): Could not parse argument to digest function: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT' at line 1".

뭐가 특별한지 보셨습니까?'HELP'는 유효하지만 클라이언트 측의 유일한 키워드(즉, 서버 키워드가 아님)라는 사실입니다.어떤 경우든 잘못된 SQL 문은 비슷한 상황을 만들어 냅니다. 즉, ERROR.

따라서 ERROR 대 NO ERROR에 따라 확인하여 전달된 SQL 구문이 유효한지 여부를 확인할 수 있습니다(클라이언트 측 전용 명령어의 매우 제한된 집합은 제외하지만 대부분의 사용자는 이러한 명령어를 사용할 수 없습니다).

요약;SELECT STATEMENT_DIGEST_TEXT는 포괄적인 SQL 파서(직접/의도된 기능은 아닐 수도 있음)로, 실제로 실행하지 않고도 모든 경우에 문의 유효성을 신속하게 확인할 수 있습니다.이는 SQL 유효성 검증에 관한 한 큰 진전입니다.

이를 위해서는 MySQL 서버를 설치하고 실행해야 합니다.를 사용하여 쿼리를 전달할 수 있습니다.mysql -e클라이언트 또는 파이프를 사용하여 다음 작업을 수행합니다.mysql기타.

기본 렉서는 sql/sql_lex.cc에 구현된 것 같습니다.테스트 파서를 직접 제작하는 데 사용/저장할 수 있습니다.그러나 이것은 구문만 검사할 뿐 런타임 오류는 검사하지 않습니다.

edit: MySQL 8.0+의 경우 .sql 파일에서 SQL 구문을 확인하려면 어떻게 해야 합니까?를 참조하십시오.

TLDR:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"

이상하게도, mysql에는 이것을 위한 스위치가 내장되어 있지 않지만, 당신은 syntax를 추가하여 확인할 수 있습니다.EXPLAIN질문 앞에 진술할 수 있습니다.

만약 당신이.statements.sql각 문장을 한 줄에 붙여 파일을 작성하고, 추가합니다.EXPLAIN모든 줄 앞에 다음을 표시합니다.

>awk '{print "EXPLAIN " $0}' statements.sql > check.sql

그런 다음 에 대한 문을 실행할 수 있습니다.mysql명령줄 도구 및 사용--force오류가 발생하면 계속 처리할 수 있습니다.구문이 올바르지 않은 문에 대한 오류를 인쇄합니다.

>mysql --force -u user -p database < check.sql

또는 오류가 있는 선만 보려면:

>mysql --force -u user -p database < check.sql | grep "ERROR"

중간 파일을 만들지 않고 한 줄에서 이 모든 작업을 수행할 수 있습니다.

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"

MySQL 쿼리 브라우저(GUI Tools 패키지의 일부)와 같은 쿼리 브라우저에 붙여넣고 키워드와 문자열 리터럴의 색상을 시각적으로 검사하여 구문 오류가 있는지 보다 쉽게 확인할 수 있습니다.

http://dev.mysql.com/downloads/gui-tools/5.0.html

MySQL 데이터베이스에 연결하거나 스크립트에 붙여넣어 검증할 수 있는 몇 가지 무료/트라이웨어 제품이 있습니다.구글은 당신의 친구입니다.Mimer는 ANSI-Standard 구문 유효성 검사를 확인할 것이지만 MySQL 세부 사항은 처리하지 않을 수 있습니다.

몇 가지 가능성이 있습니다.트랜잭션을 지원하는 InnoDB 테이블을 사용하는 경우 간단히 실행할 수 있습니다.start transaction;당신의 .sql 파일의 시작에 그리고 a.rollback;맨 끝에MySQL은 구문 오류를 출력합니다.

검사하는 경우UPDATE아니면DELETE문장, 추가할 수 있습니다.LIMIT 0마지막으로 이러한 쿼리가 데이터베이스를 변경하는 것을 방지하고 MySQL이 구문을 검사하도록 합니다.

그냥 실행해요..

거래를 개시합니다

운영하다, 실행합니다.

롤백

언급URL : https://stackoverflow.com/questions/956507/how-can-i-check-the-sql-syntax-in-a-sql-file

반응형