[SQL] 정규 표현식은 일반 SQL 구문에 맞게?
SQL정규 표현식은 일반 SQL 구문에 맞게?
나는 어떤 단위가 어떤 SQL 문을 생성 된 코드의 조각을 위해 지난 주 테스트 기록했다.
나는 내 방법이 유효한 SQL을 생성되었는지 확인 할 수 있도록 SELECT, INSERT 및 UPDATE 구문과 일치하는 정규식 알아 내려고 노력하였으며, 검색 및 다양한 정규식 편집기와 장난 3-4 시간 후에 나는 포기했다.
나는 부분 일치를 얻을 수 있었다하지만 따옴표 섹션이 모든 문자를 포함 할 수 있기 때문에 신속하게 전체 문을 일치하도록 확장합니다.
어떤 도움을 내가 정규식 아주 좋은 아니에요 감사하겠습니다 그러나 나는 그들에 대해 자세히 알아 보려면.
난 후하는 방식 그것의 C # 정규식으로.
설명
이것은 단위 테스트의 일부이며 내 코드를 테스트 할 수있는 데이터베이스를 유지 관리해야 할 wan't하지 않는 한 나는 데이터베이스에 필요에 액세스하지 않습니다. 어떤 프로젝트보다 더 오래 살 수 있습니다.
해결법
-
==============================
1.SQL은 구문 반면 정규 표현식은 매우 제한되어있는 경우에만 유한 상태 자동 장치가 구문 분석 할 수있는 언어를 일치시킬 수 있습니다. 당신이 정규식과 SQL을 확인할 수 없습니다 입증 할 수있다. 그래서, 당신은 시도 중지 할 수 있습니다.
SQL은 구문 반면 정규 표현식은 매우 제한되어있는 경우에만 유한 상태 자동 장치가 구문 분석 할 수있는 언어를 일치시킬 수 있습니다. 당신이 정규식과 SQL을 확인할 수 없습니다 입증 할 수있다. 그래서, 당신은 시도 중지 할 수 있습니다.
-
==============================
2.SQL은 정규 표현식에 의해 설명 될 수이 너무 강력하다, 유형 2 문법이다. 당신은 C # 코드를 생성 한 후 컴파일러를 호출하지 않고 그것을 확인하기로 결정 것처럼 그것은 동일합니다. 일반적으로 데이터베이스 엔진은 쉽게 스텁하기에는 너무 복잡하다.
SQL은 정규 표현식에 의해 설명 될 수이 너무 강력하다, 유형 2 문법이다. 당신은 C # 코드를 생성 한 후 컴파일러를 호출하지 않고 그것을 확인하기로 결정 것처럼 그것은 동일합니다. 일반적으로 데이터베이스 엔진은 쉽게 스텁하기에는 너무 복잡하다.
즉, ANTLR의 SQL 문법을 시도 할 수 말했다.
-
==============================
3.내가 아는 한이 정규식 넘어와 BNF와 컴파일러의 어두운 예술로 점점 부근에 있습니다.
내가 아는 한이 정규식 넘어와 BNF와 컴파일러의 어두운 예술로 점점 부근에 있습니다.
http://savage.net.au/SQL/
같은 일들이 올바른 구문 강조를하고 싶은 사람들에게 발생합니다. 당신은 정규식으로 일을 밀어 넣는 시작하고 당신은 컴파일러를 작성 결국 ...
-
==============================
4.다음, 당신은 오류 "테이블이 존재하지 않습니다"돌아갈 경우, 메모리 내 SQLite 데이터베이스를 회전과에 대한 쿼리를 실행하는 것입니다 더욱 표준 SQL 문에 대해 일하는 것이 접근 - 저도 같은 문제가 있었다 쿼리가 제대로 구문 분석.
다음, 당신은 오류 "테이블이 존재하지 않습니다"돌아갈 경우, 메모리 내 SQLite 데이터베이스를 회전과에 대한 쿼리를 실행하는 것입니다 더욱 표준 SQL 문에 대해 일하는 것이 접근 - 저도 같은 문제가 있었다 쿼리가 제대로 구문 분석.
-
==============================
5.내 머리 위로 떨어져 : 데이터베이스에 생성 된 SQL을 통과하고 사용이 그들에게 설명하고 제대로 SQL을 형성 나타냅니다 예외를 잡을 수 있을까요?
내 머리 위로 떨어져 : 데이터베이스에 생성 된 SQL을 통과하고 사용이 그들에게 설명하고 제대로 SQL을 형성 나타냅니다 예외를 잡을 수 있을까요?
-
==============================
6.당신은 게으른 선택기를 시도. 오히려 가능한 한만큼 일치하는 것보다, 그들은 아마 당신이 따옴표를 위해 필요하다 가능한 한 적게 일치합니다.
당신은 게으른 선택기를 시도. 오히려 가능한 한만큼 일치하는 것보다, 그들은 아마 당신이 따옴표를 위해 필요하다 가능한 한 적게 일치합니다.
-
==============================
7.단지 SET NOEXEC ON으로 그들을 실행 쿼리를 확인하려면, 그것은 당신이 그것을 실행하지 않고 쿼리를 구문 분석 할 때 ENTREPRISE 관리자가 작업을 수행하는 방법이다.
단지 SET NOEXEC ON으로 그들을 실행 쿼리를 확인하려면, 그것은 당신이 그것을 실행하지 않고 쿼리를 구문 분석 할 때 ENTREPRISE 관리자가 작업을 수행하는 방법이다.
당신이 사용하는 경우 또한 정규식에 대한 유효성 검사 SQL 쿼리, 당신은 당신이 올바른 구문의 경우에도, 쿼리가 다른 이유에서 유효하지 않은 몇 가지 코너 케이스를 그리워하거나 것이라고 거의 확신 할 수 있습니다.
-
==============================
8.나는 아마도 임베디드 SQL 엔진을 사용하여, 동일한 스키마와 데이터베이스를 생성하고, 그에 SQL을 전달하는 것이 좋습니다.
나는 아마도 임베디드 SQL 엔진을 사용하여, 동일한 스키마와 데이터베이스를 생성하고, 그에 SQL을 전달하는 것이 좋습니다.
-
==============================
9.나는 시스템이 성공적으로 문을 구문 분석 할 때까지 OBJECT_NAME 등을 해결하려고하지 않기 때문에 당신도, 문을 검증 할 수 있도록 만든 스키마를 가질 필요가 있다고 생각하지 않습니다.
나는 시스템이 성공적으로 문을 구문 분석 할 때까지 OBJECT_NAME 등을 해결하려고하지 않기 때문에 당신도, 문을 검증 할 수 있도록 만든 스키마를 가질 필요가 있다고 생각하지 않습니다.
당신이 한 경우 예를 들어 오라클과 함께, 당신은 확실히 오류가 발생하는 것입니다 :
select * from non_existant_table;
이 경우, "ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다."
그러나 당신이 실행하는 경우 :
select * frm non_existant_table;
그런 다음에 구문 오류가 발생합니다 "ORA-00923은 : FROM 키워드 예상 한 위치에 찾을 수 없습니다."
그것은 잘못된 구문과 테이블 이름과 권한 등 관련 오류를 표시 구문 분석 오류로 분류 오류로 가능한다고 ..
에 추가 다른 RDBMS에, 심지어 서로 다른 버전의 문제가 다른 구문을 허용하고 난 당신이 정말이 작업에 대한 DB 엔진에 가야 생각.
-
==============================
10.ANTLR은 SQL 구문 분석 문법이 있습니다. 정말 메모리 데이터베이스 또는 sqlite가 같은 아주 가벼운 데이터베이스에 사용하는 것이 더 좋습니다. SQL 테이블 및 열 이름 및 쿼리의 세부 사항을 확인하는 것이 훨씬 더 유용한 구문 분석의 관점에서 유효 여부 검사에 나에게 낭비 보인다.
ANTLR은 SQL 구문 분석 문법이 있습니다. 정말 메모리 데이터베이스 또는 sqlite가 같은 아주 가벼운 데이터베이스에 사용하는 것이 더 좋습니다. SQL 테이블 및 열 이름 및 쿼리의 세부 사항을 확인하는 것이 훨씬 더 유용한 구문 분석의 관점에서 유효 여부 검사에 나에게 낭비 보인다.
-
==============================
11.가장 좋은 방법은 쿼리보다는 쿼리 자체를 만드는 데 사용되는 매개 변수의 유효성을 확인하는 것입니다. 변수를 수신하는 기능은 문자열, 숫자 유효한 유효한 이메일 또는 어떤 길이를 확인할 수있다. 이 검증을 수행하는 정규 표현식을 사용할 수 있습니다.
가장 좋은 방법은 쿼리보다는 쿼리 자체를 만드는 데 사용되는 매개 변수의 유효성을 확인하는 것입니다. 변수를 수신하는 기능은 문자열, 숫자 유효한 유효한 이메일 또는 어떤 길이를 확인할 수있다. 이 검증을 수행하는 정규 표현식을 사용할 수 있습니다.
-
==============================
12.
public bool IsValid(string sql) { string pattern = @"SELECT\s.*FROM\s.*WHERE\s.*"; Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase); return rgx.IsMatch(sql); }
-
==============================
13.난 당신이 뭔가를 한 가정입니다. \ * "^] 대신하려고 * 그 전체 라인을 먹고에서 당신을 유지합니다. 아직도 당신이 당신의 문자열 안에 \이 경우에 오탐 (false positive)을 줄 것이다.
난 당신이 뭔가를 한 가정입니다. \ * "^] 대신하려고 * 그 전체 라인을 먹고에서 당신을 유지합니다. 아직도 당신이 당신의 문자열 안에 \이 경우에 오탐 (false positive)을 줄 것이다.
from https://stackoverflow.com/questions/139926/regular-expression-to-match-common-sql-syntax by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 서브 타입의 참조 무결성을 구현하는 방법 (0) | 2020.04.26 |
---|---|
[SQL] 엔티티 프레임 워크 - 저장 프로 시저의 반환 값 (0) | 2020.04.26 |
[SQL] 어떻게 SQLite는 TIMESTAMP 값을 비교 (0) | 2020.04.26 |
[SQL] 어디 문에서 SQL을 사용하여 별칭 (0) | 2020.04.26 |
[SQL] 잠금 장치의 총 수는 로크 테이블 크기를 초과 (0) | 2020.04.26 |