2012-05-15 2 views
2

복합 트리거 사용에 관한 매우 빠른 질문이 있습니다.오라클 11g 화합물 트리거 응용 프로그램

나는 데이터베이스/SQL/오라클에 아주 새로운 해요 다음에 대한 트리거를 만들 수있는 내가 있었다 유니 작업이 있습니다 판매 사람이 순서를 만들 때

  1. 로그 테이블에 삽입을
  2. 주문 테이블 업데이트 주문 준비 완료 (로그에 삽입)
  3. 오전 9시 월요일부터 오전 9 시까 지, INSERT, UPDATE, DELETE를 방지하십시오.

나는 트리거를 성공적으로 구현했지만 11g에서 복합 트리거를 인식하게되었습니다. 위의 내용을 하나의 복잡한 트리거로 결합하는 것이 적절한 지 알아볼 수 있습니까? 그것이 그들이 무엇을위한 것입니까, 아니면 제가 그 요점을 놓치고 있습니까?

다소 모호한 질문에 많은 감사드립니다.

답변

3

IMO 적절하지 않습니다. 복합 트리거를 사용하면 주어진 테이블에서 주어진 액션에 대해 네 개의 다른 트리거 포인트 (before 구문, before 동작, after 작업 및 after 구문)를 트랩 할 수 있지만 A) 여러 개의 테이블에서 트리거하는 것과 B) 모든 다른 트리거 포인트를 서비스 할 필요가 없습니다. (BTW, "action"은 여기에서 사용한 것처럼 다른 문장 유형, 예를 들어 INSERT, UPDATE, DELETE ...)을 의미 할 수 있습니다.

컴파운드 트리거를 사용하면 멋지고 깔끔하고 간결한 방법으로 인기없는 ORA-04091 MUTATING TABLE 오류를 해결할 수 있습니다. 그러나 대부분의 경우 범용 목적으로 필요하거나 유용하지 않습니다. - "일반"트리거를 대체합니다. 예를 들어 this question에 대한 내 대답을 참조하십시오.

공유하고 즐기십시오.

+0

나는 (물론 이것은 유니 프로젝트이며 항상 거대한 데이터베이스의 기능을 압박한다고 들었습니다. 트리거/테이블/튜플의 질량) 로그 테이블 (트리거 1 및 2)에 삽입하기 전에 compute 트리거를 사용하여 datetime (트리거 3)을 확인하는 것은 정확하지 않습니까? –

+1

정답은 정의하기 힘든 것이지만, 개인적으로는 실제로는 필요없는 모든 트리거 포인트 때문에 개인적으로 그렇게하고 싶지 않습니다. 나는 1과 2가 AFTER INSERT 행 트리거가되고, 3은 BEFORE INSERT, UPDATE, DELETE 문 트리거가 될 것이라고 가정합니다. 그것을 보면, 나는 어쨌든 트리거에서 2와 3을하는 것에 신경을 쓰지 않을 것이다. - 트리거의 첫 번째 규칙 (물론, 좋다. * MY * 트리거의 첫 번째 규칙)은 "당신은 트리거에 비즈니스 로직을 구현하지 말라. 이것은 강 광증 위의 언덕에 미끄러운 경사입니다! ". YMMV. –

1

와우 - - 화합물은 트리거 다음과 같이 설명 트리거 내가 빨리 the documentation

화합물을 사용하는 주된 이유를 보았다

... 그들이 존재조차 몰랐 :

복합 트리거를 사용하면 여러 가지 타이밍 포인트에 대해 구현 한 동작에서 공통 데이터 인 을 공유하는 방식을 쉽게 프로그래밍 할 수 있습니다. 간단한 트리거를 사용하여 동일한 효과를 얻으려면 을 사용하여 보조 패키지로 공통 상태를 모델링하십시오. 이 접근 방식은 트리거 문이 오류를 일으키고 after 문 트리거 이 실행되지 않았을 때 프로그래밍하기가 번거롭고 메모리 누수가 발생할 수 있으므로 모두 이었습니다.

귀하의 기능을 구현하기 위해 패키지 변수가 필요하지 않은 경우, 사용 이유가 없습니다. 그리고 귀하의 코드는 더 이상 10g 호환되지 않습니다.

+0

감사합니다. 그 문서를 보았습니다. 그러나 상대적인 '멍청한 놈'이되어서 나는 그것을 이해하지 못했습니다 :/ –