2012-02-23 1 views
6

SQL 데이터베이스 엔진 내부에서 트리거가 어떻게 구현됩니까? SQL 언어 수준의 트리거 정의를 말하는 것이 아니라 오라클, SQL Server, MySQL 등의 내부 구현에 대해 언급하고 있습니다. 데이터베이스 엔진은 수십만 개의 트리거를 확장 가능하게 관리 할 수 ​​있습니까? 관찰자/수신기 패턴과 같은 게시 - 구독 모델을 사용합니까? 주제에 관한 관련 문헌에 대한 조언도 제공됩니다.SQL 데이터베이스 엔진 내부에서 데이터베이스 트리거가 어떻게 구현됩니까?

"데이터베이스 트리거 구현"에 대해 google을 사용했지만 SQL 트리거 정의에 대한 정보는 모두 찾고 싶지 않았습니다.

+0

나는 이것이 [dba.se]에 있어야한다고 생각합니다. ..; 그러나 나는 실제로 알지 못하기 때문에 그것을 계속 지켜 볼 것입니다. – Ben

답변

3

트리거는 콜백이므로 C에서 함수 포인터만큼 구현이 간단 할 수 있습니다. 일반적으로 사용자는 C에서 RDBMS에 사용자 정의 프로 시저 코드를 작성하지 않아도됩니다. 다른 "상위 수준"언어를 지원해야합니다. 따라서 관련 프로그래밍 패턴은 DSL입니다. 일반적으로 트리거 (확장 성)의 수는 문제가되지 않습니다. 테이블 당 최대 두 개와 DML 이벤트 만 있기 때문입니다. 구현상의 문제는 다른 곳에서 발생합니다 : 일관성, 동시성 의미의 영역입니다.

+0

나는 내 시스템에서 트리거 같은 메커니즘을 구현하려고합니다. 예, 나는 "사용자가 RDBMS에서 [sic] 사용자 정의 절차 코드를 작성하는 것이 아닙니다"라는 것을 알고 있습니다. 나는 "테이블 당 보통 하나, 최대 2 개"라는 가정에 제한하지 않습니다. 나는 수천 개의 트리거가있을 수있는 최고급 사례를보고 있습니다. – stackoverflowuser2010

+1

삽입 이벤트, 업데이트 이벤트, 삭제 이벤트는 극히 제한되어 있습니다. 다른 이벤트는 생각하지 못합니다. 이상한 볼 시나리오에서는 트리거가 수천 개의 프로 시저를 호출 할 수 있습니다.하지만 여기서는 사용자의 요구 사항을 이해하지 못하는 환상의 땅으로 완전히 벗어났습니다. –

1

우선 끄기는 특정 이벤트 (예 : 특정 테이블의 INSERT/UPDATE/DELETE)가 데이터베이스에서 발생할 때 실행되는 코드 조각입니다. 트리거는 암시 적으로 DML 문에서 BEFORE 또는 AFER로 실행되며 트리거는 저장 프로 시저처럼 명시 적으로 실행할 수 없습니다.

트리거에는 STATEMENT LEVEL 트리거와 ROW LEVEL 트리거의 두 가지 유형이 있습니다.

STATEMENT LEVEL 트리거는 명령문이 실행되기 전 또는 후에 발생합니다.

ROW LEVEL 트리거는 작업의 영향을받는 개별 행에서 BEFORE 또는 AFTER를 실행 한 후에 실행됩니다.

1. BEFORE INSERT STATEMENT 
2. BEFORE INSERT ROW 
3. AFTER INSERT STATEMENT 
4. AFTER INSERT ROW 
5. BEFORE UPDATE STATEMENT 
6. BEFORE UPDATE ROW 
7. AFTER UPDATE STATEMENT 
8. AFTER UPDATE ROW 
9. BEFORE DELETE STATEMENT 
10. BEFORE DELETE ROW 
11. AFTER DELETE STATEMENT 
12. AFTER DELETE ROW 

여러 트리거가 언급 한 실행의 우선 순위의 순서로 이벤트를 코딩 할 수 있습니다

그래서 우리는 트리거의 12 가지 유형이있다.

데이터베이스에서 DML 쿼리 (INSERT/UPDATE/DELETE)를 실행할 때마다 해당 쿼리가 트랜잭션에서 실행됩니다. 쿼리가 실행 따라서시 -

  1. 표는 문이
  2. 실제 SQL 문을 행 단위를 실행 실행하기 전에 실행 트리거에 대한
  3. DBMS의 검사를 잠겨 있습니다.
  4. 각 행에 대한 BEFORE 트리거가 검색됩니다. 발견되면 실행됩니다.
  5. 오류를 확인하십시오. 있는 경우 명령문 또는 트리거에 의해 변경된 내용을 롤백하십시오.
  6. AFTER EACH ROW 트리거가 발견되어 실행됩니다.
  7. 모든 AFTER STATEMENT 트리거가 발견되어 실행됩니다.

다른 DBMS는 트랜잭션을 다르게 관리합니다. 자세한 내용은 해당 설명서를 참조하십시오.

많은 DBMS는 컴파일 된 저장 프로 시저와 달리 텍스트 형식으로 만 트리거를 유지합니다.

저장 프로 시저가 트리거보다 훨씬 빠른 성능을 발휘하므로 트리거 본문 내부에서 저장 프로 시저를 호출하는 것이 가장 좋습니다.

관련 문제