27.1 Stored Program 제한
이러한 제약은 제 20 장 "저장 프로그램 및 뷰" 에서 설명하고있는 기능에 적용됩니다.
여기에 기재되어있는 범위 내에서는 모든 스토어드 루틴, 즉 저장 프로 시저 및 스토어드 함수 모두에 적용되는 것이 있습니다. 또한 저장 프로 시저에는 적용되지 않고, 스토어드 함수에 고유의 제약 도 일부 존재합니다.
저장 기능의 제한은 트리거에도 적용됩니다. 트리거에 고유의 제약 도 일부 있습니다.
저장 프로 시저의 제약은 이벤트 스케줄러 이벤트 정의의 DO
절에도 적용됩니다. 이벤트에 특정한 제약 도 일부 있습니다.
스토어드 루틴에서 허용되지 않는 SQL 문
스토어드 루틴에는 자유롭게 SQL 문을 포함 할 수 없습니다. 다음 문은 허용되지 않습니다.
LOCK TABLES
및UNLOCK TABLES
잠금 문.ALTER VIEW
.LOAD DATA
및LOAD TABLE
.SQL 준비된 명령문 (
PREPARE
,EXECUTE
,DEALLOCATE PREPARE
) 저장 프로 시저에서 사용할 수있는 저장 기능과 트리거로 사용할 수 없습니다. 따라서 스토어드 함수 및 트리거는 동적 SQL (이 경우 문을 문자열로 구축하고 실행합니다)를 사용할 수 없습니다.일반적으로 SQL 준비된 명령문에서 허용되지 않은 문은 저장 프로그램에서도 허용되지 않습니다. 준비된 명령문으로 지원되는 문의 목록은 섹션 13.5 "준비된 문을위한 SQL 구문" 을 참조하십시오. 예외는
SIGNAL
,RESIGNAL
및GET DIAGNOSTICS
이며, 이들은 준비된 명령문으로 허용되지 않지만, 저장 프로그램에서 허용됩니다.로컬 변수는 저장 프로그램 실행 중에 만 범위 내에 있으므로 이러한 참조는 저장 프로그램에서 생성 된 준비된 명령문은 허용되지 않습니다. 준비된 명령문의 범위는 현재의 세션이며, 저장 프로그램이 아니기 때문에 문은 프로그램의 종료 후에 수행 할 수 있으며 이때 변수는 범위 내에 존재하지 않습니다. 예를 들어,
SELECT ... INTO
는 준비된 명령문으로 사용할 수 없습니다. 이 제약은 저장 프로 시저 및 저장 함수의 매개 변수에 적용됩니다. 섹션 13.5.1 "PREPARE 구문" 을 참조하십시오.local_var
삽입은 지연되지 않습니다.
INSERT DELAYED
구문은 사용할 수 있지만, 문은 일반INSERT
로 처리됩니다.모든 저장 프로그램 (저장 프로 시저와 저장 함수, 트리거 및 이벤트)에서 파서는
BEGIN [WORK]
를BEGIN ... END
블록의 시작으로 간주합니다. 이러한 맥락에서 트랜잭션을 시작하려면 대신START TRANSACTION
을 사용합니다.
저장 기능의 제약
다음 추가 명령 또는 조작은 스토어드 함수 내에서 허용되지 않습니다. 이러한 저장 프로 시저에서 허용되어 있지만, 스토어드 함수 또는 트리거 내에서 호출되는 저장 프로 시저를 제외합니다. 예를 들어 저장 프로 시저에서 FLUSH
를 사용하는 경우, 스토어드 함수 또는 트리거에서 저장 프로 시저를 호출 할 수 없습니다.
명시 적 또는 암시 적 커밋 또는 롤백을 실행하는 문. 이러한 진술의 지원은 SQL 표준에서는 필요하지 않습니다. SQL 표준에서는 각 DBMS 벤더들이 문을 허용할지 여부를 결정할 수있는 규정하고 있습니다.
결과 집합을 반환 문. 여기에는
INTO
절이없는var_list
SELECT
문과SHOW
,EXPLAIN
및CHECK TABLE
과 같은 다른 문이 포함됩니다. 함수는SELECT ... INTO
를 사용하거나 커서와var_list
FETCH
문을 사용하여 결과 세트를 처리 할 수 있습니다. 섹션 13.2.9.1 "SELECT ... INTO 구문" 및 섹션 13.6.6 "커서" 를 참조하십시오.FLUSH
문.스토어드 함수는 재귀 적으로 사용할 수 없습니다.
스토어드 함수 또는 트리거는 그 스토어드 함수 또는 트리거를 호출 한 명령문이 (읽기 또는 쓰기) 이미 사용되는 테이블을 변경할 수 없습니다.
스토어드 함수에서 임시 테이블을 다른 별칭으로 여러 번 참조하면 스토어드 함수 내의 다른 문에서 참조 할 경우에도
「
Can't reopen table: 'tbl_name'」
라는 오류가 발생합니다.스토어드 함수를 호출
HANDLER ... READ
문은 복제 오류를 일으킬 수 있고, 허용되지 않습니다.
트리거 제약
트리거의 경우 또한 다음과 같은 제한이 적용됩니다.
트리거는 외부 키 액션으로 활성화되지 않습니다.
행 기반 복제를 사용하는 경우, 슬레이브의 트리거 마스터에서 발행 된 문으로 활성화되지 않습니다. 슬레이브의 트리거는 문 기반 복제를 사용할 때 활성화됩니다. 자세한 내용은 섹션 17.4.1.32 "복제 및 트리거" 를 참조하십시오.
RETURN
문은 트리거에서 허용되지 않습니다. 트리거는 값을 반환 할 수 없습니다. 즉시 트리거를 종료하려면LEAVE
문을 사용합니다.트리거는
mysql
데이터베이스의 테이블에서 허용되지 않습니다.트리거 캐시는 기반이되는 객체의 메타 데이터가 변경된 경우 감지하지 않습니다. 트리거가 테이블을 사용하여 트리거가 캐시에로드 된 후에 그 테이블에 변경이있는 경우 트리거는 이전 메타 데이터를 사용하여 작동합니다.
스토어드 루틴의 이름 충돌
루틴 파라미터, 로컬 변수 및 테이블 컬럼에 동일한 식별자가 사용되는 경우가 있습니다. 또한 같은 로컬 변수 이름을 중첩 된 블록에서 사용할 수 있습니다. 예 :
CREATE PROCEDURE p (i INT) BEGIN DECLARE i INT DEFAULT 0; SELECT i FROM t; BEGIN DECLARE i INT DEFAULT 1; SELECT i FROM t; END; END;
이러한 경우 식별자는 모호 다음 우선 순위 규칙이 적용됩니다.
로컬 변수는 루틴 파라미터 또는 테이블 컬럼보다 우선합니다.
루틴 파라미터는 테이블 컬럼 보다 우선합니다.
내부 블록 내의 로컬 변수는 외부 블록의 지역 변수보다 우선합니다.
변수 테이블 컬럼이 우선되는 동작은 비표준입니다.
복제 고려 사항
스토어드 루틴을 사용하면 복제 문제가 발생할 수 있습니다. 이 문제에 대해서는 섹션 20.7 "저장 프로그램의 바이너리 로깅" 에서 선발 있습니다.
--replicate-wild-do-table=
옵션은 테이블, 뷰 및 트리거에 적용됩니다. 저장 프로 시저 및 함수 또는 이벤트에 적용되지 않습니다. 후자의 객체로 작용하는 문을 필터링하려면 하나 이상의 db_name.tbl_name
--replicate-*-db
옵션을 사용합니다.
디버깅 고려 사항
스토어드 루틴 디버깅 기능은 존재하지 않습니다.
SQL : 2003 표준 지원되지 않는 구문
MySQL 스토어드 루틴 구문은 SQL : 2003 표준에 근거합니다. 이 표준의 다음 항목은 현재 지원되지 않습니다.
UNDO
핸들러FOR
루프
병렬성 고려 사항
세션 간의 상호 작용 문제를 방지하기 위해 클라이언트의 문 발행시 서버에서 문 실행할 수있는 루틴과 트리거의 스냅 샷이 사용됩니다. 즉, 서버는 문이 실행되는 동안 사용될 수있는 프로 시저, 함수 및 트리거 목록을 산출하여로드 문 실행으로 이동합니다. 문을 실행할 때, 다른 세션이 실행하는 루틴에 대한 변경은 인식되지 않습니다.
병렬성을 극대화하기 위해 스토어드 함수는 그 부작용을 최소화해야합니다. 특히 스토어드 함수에서 테이블을 업데이트함으로써 그 테이블에서 병렬 작업을 줄일 수 있습니다. 저장 기능은 실행 전에 테이블 락을 취득하여 문이 실행되는 순서와 로그에 표시 될 때의 순서 불일치 바이너리 로그의 불일치를 방지합니다. 명령문 기반 바이너리 로깅이 사용되는 경우 함수 내에서 실행되는 명령문이 아닌 함수를 호출 문이 기록됩니다. 그 결과 동일한 기반 테이블을 업데이트하는 스토어드 함수는 병렬로 실행하지 않습니다. 대조적으로, 저장 프로 시저는 테이블 수준의 잠금을 획득하지 않습니다. 저장 프로 시저에서 실행 된 모든 문은 명령문 기반 바이너리 로깅의 경우에도 바이너리 로그에 기록됩니다. 섹션 20.7 "저장 프로그램의 바이너리 로깅" 을 참조하십시오.
이벤트 스케줄러 제약
다음의 제한은 이벤트 스케줄러에 고유의 것입니다.
이벤트 이름은 대소 문자를 구별하지 않고 처리됩니다. 예를 들어,
anEvent
과AnEvent
라는 두 가지 이벤트를 동일한 데이터베이스에 포함 할 수 없습니다.이벤트는 스토어드 루틴, 트리거 또는 다른 이벤트에 의해 생성, 수정, 삭제 할 수 없습니다. 이벤트는 스토어드 루틴과 트리거를 생성, 수정, 삭제 할 수 없습니다. (Bug # 16409, Bug # 18896)
LOCK TABLES
명령문의 기능을 사용하면 이벤트에 DDL 문은 금지되어 있습니다.YEAR
,QUARTER
,MONTH
및YEAR_MONTH
간격을 사용하여 이벤트의 타이밍은 달에서 해결됩니다. 다른 간격을 사용하는 타이밍은 초 단위로 해결됩니다. 동시에 수행되도록 예약 된 이벤트는 지정된 순서대로 수행 할 수 없습니다. 또한 반올림 스레드 응용 프로그램의 특성 및 이벤트를 만들고 그 실행을 신호로 전달하는 제로 이외의 시간 길이가 필요하기 때문에 이벤트가 1,2 초 정도 지연 될 수 있습니다. 그러나INFORMATION_SCHEMA.EVENTS
테이블LAST_EXECUTED
컬럼 또는mysql.event
테이블last_executed
컬럼에 표시된 시간은 항상 실제 이벤트 실행 시간 1 초 이내의 정확도됩니다. (Bug # 16522를 참조하십시오.)이벤트의 본문에 포함 된 문은 각각 새로운 연결에서 실행되기 때문에 이러한 진술은 특정 사용자 세션에서
SHOW STATUS
에 의해 표시되는Com_select
과Com_insert
같은 서버의 문 개수에 영향을주지 않습니다. 그러나 이러한 숫자는 전역으로 업데이트됩니다. (Bug # 16422)이벤트는 Unix 에포크의 마지막 시간 이상을 지원하지 않습니다. 이 시간은 2038 년 연두 당합니다. 이러한 날짜는 이벤트 스케줄러에서 특별히 허용되지 않습니다. (Bug # 16396)
CREATE EVENT
및ALTER EVENT
문ON SCHEDULE
절에서 스토어드 함수, 사용자 정의 함수 및 테이블 참조는 지원되지 않습니다. 이런 종류의 참조는 허용되지 않습니다. (자세한 내용은 Bug # 22830를 참조하십시오.)