MySQL 저장 루틴의 동적 SQL


답변:


8

질문을 듣는 것만으로 두 가지 측면을 생각할 수 있습니다.

ASPECT # 1 : 함수는 결정적입니다

이 경우, 함수가 함수를 호출 할 때 어떤 매개 변수도 주어진 매개 변수 세트에 대해 동일한 리턴 데이터를 일관되게 표시해야 함을 의미합니다.

이제 함수의 정적 SQL을 기반으로 하루 중 다른 시간에 데이터를 수집하기 때문에 다른 응답을 생성하는 함수를 상상해보십시오. 어떤 의미에서, 동일한 매개 변수 세트가 주어질 때마다 동일한 테이블 및 열 세트를 조회 할 경우에도 여전히 DETERMINISTIC으로 간주 될 수 있습니다.

Dynamic SQL을 통해 함수의 기본 테이블을 변경할 수 있다면 어떨까요? DETERMINISTIC 함수의 정의를 위반하고 있습니다.

MySQL은이 옵션을 /etc/my.cnf에 추가했습니다.

log-bin-trust-function-creators

이것은 지나치게 단순화 된 것일 수도 있지만 DETERMINISTIC 속성을 엄격하게 적용하지 않고 함수가 이진 로그에 데이터를 쓸 수 있도록합니다.

ASPECT # 2 : 트리거를 롤백 할 수 있어야합니다

  • 함수와 동일한 동작을 모두 한 다음 트리거에 Dynamic SQL을 도입 한 트리거를 상상할 수 있습니까?
  • 트리거가 예정된 기본 테이블에 MVCC를 적용한 후 Dynamic SQL에 대해 MVCC (Multiversion Concurrecy Control) 를 적용하려고한다고 상상할 수 있습니까?

기본적으로 MVCC에서만 2 차적으로 (지수 적으로) 증가하는 데이터가 있습니다. 결정적이지 않을 수있는 트리거로 SQL 롤백을 관리하는 프로세스는 가장 까다로울 수 있습니다.

이 두 가지 측면에 비추어, MySQL 개발자들은 이러한 것들에 대해 생각하고 제한을가함으로써 신속하게 해산했습니다.

그렇다면 왜 절차 제한을 해제해야합니까? 간단히 말해 결정적 속성이나 롤백에 대한 걱정은 없습니다.


3
다른 DBMS가 트리거에서 MVCC 및 동적 SQL을 매우 잘 지원할 수있는 경우 "거의 복잡"할 수 없습니다.
a_horse_with_no_name

1
사실, @a_horse_with_no_name이 맞습니다. Oracle과 PostgreSQL의 경우, 경건한 코드가 코딩되었습니다. 댓글 +1 MySQL은 여러 스토리지 엔진을 처리 할 수있는 장애가 있으므로 롤백 및 결정에는 스토리지 엔진 작업의 중복이 필요할 수 있습니다. 조금 무섭다. 어쩌면 누군가 "InnoDB"에 "엄청나게 복잡한"것을 완전히 밀어 붙일 수있을 것이다. 동일한 쿼리 내에서 스토리지 엔진을 혼합 할 수없는 방식으로 스토리지 엔진 특정 트리거 구현을 작성하는 것이 더 바람직합니다.
RolandoMySQLDBA

5

이것은 좋은 질문이지만 답을 모르겠습니다. 나는 이것이 내부 팀으로 가야한다고 생각하지만, 그들이이 사이트에 커질 지 모른다. 그동안 답변을 추론하도록 도와 드리겠습니다.

우선 나는 이것을 본다 :

트리거 캐시는 기본 개체의 메타 데이터가 변경된시기를 감지하지 않습니다. 트리거가 테이블을 사용하고 트리거가 캐시에로드 된 이후 테이블이 변경된 경우 트리거는 오래된 메타 데이터를 사용하여 작동합니다.

그것은 그것이 그것과 관련이 있다고 생각하게 만듭니다. 메타 데이터를 모니터링하지 않으면 SQL을 다시 컴파일하지 않을 것입니다. 엔진 문제라는 의미입니다.

마찬가지로,이 블록을 읽을 때 동일한 것 (엔진)을 생각합니다.

클라이언트가 명령문을 발행 할 때 서버 스레드 간의 상호 작용 문제점을 방지하기 위해 서버는 명령문의 실행에 사용 가능한 루틴 및 트리거의 스냅 샷을 사용합니다. 즉, 서버는 명령문 실행 중에 사용될 수있는 프로 시저, 함수 및 트리거 목록을 계산하여로드 한 다음 명령문을 실행합니다. 이는 명령문이 실행되는 동안 다른 스레드가 수행하는 루틴의 변경 사항을 볼 수 없음을 의미합니다.

그래서 나는 그들이 왜 그것을 허용하지 않는지 완전히 확신하지 못하지만 추측 할 수 있습니다. 더 이상 도와 드릴 수 없어서 죄송합니다.이 문제를 좀 더 해결하기 위해 노력하고 있습니다. 가장 좋은 방법은 비공개 베타를 떠나면 일부 활성 MySQL 개발자를 희망하는 것입니다.)


1

대부분 보안 때문입니다. 프로 시저의 예외는 프로 시저 내의 동적 SQL에 실행중인 사용자의 보안 컨텍스트를 지정할 수 있기 때문입니다. 이는 엔진이 실행될 내용을 모르더라도 사용자가 참조 된 객체에 액세스하도록 허용 할 수 있음을 의미합니다.

그 외에도 일어날 수있는 일의 추악한 문제를 제기 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.