행 트리거 의 트리거 본문 내에서 PL/SQL 코드 및 SQL 문은 트리거링 문의 영향을 받는 현재 행의 이전 및 새 열 값에 액세스할 수 있습니다. 수정중인 테이블의 모든 열에 대해 두 개의 상관 이름이 있습니다. 트리거링 문의 유형에 따라 특정 상관 관계 이름에는 아무의미가 없습니다. 트리거는 일반적으로 테이블 데이터에 대한 복잡한 보안 권한을 적용하는 데 사용됩니다. 트리거만 사용하여 Oracle Database와 함께 제공되는 데이터베이스 보안 기능을 사용하여 정의할 수 없는 복잡한 보안 권한을 적용합니다. 예를 들어 트리거는 주말, 공휴일 및 비근무 시간 동안 Emp_tab 테이블의 급여 데이터에 대한 업데이트를 금지할 수 있습니다. 트리거 본문에 다른 트리거가 발생 하면 트리거가 계단식 이라고 합니다. Oracle Database를 사용하면 한 번에 최대 32개의 트리거를 계단식으로 연결할 수 있습니다. 그러나 트리거의 모든 실행에 대해 커서를 열어야 하기 때문에 초기화 매개 변수 OPEN_CURSORS를 사용하여 트리거 캐스케이드 수를 효과적으로 제한할 수 있습니다. 업데이트되는 각 행에 대해 트리거를 한 번 발생시, 각각의 경우 새 급여, 이전 급여 및 차이를 인쇄합니다.
다음과 같은 값을 테이블 test1에 삽입한다고 가정합니다. 두 번째 INSERT에서 CREATED_BY의 값은 트리거에 의해 현재 로그인된 사용자 “HR”로 대체되는 “XYZ”입니다. 2.5 테스트 트리거 발생 오류 – 사망 날짜는 미래 날짜가 될 수 없습니다. UPDATE 또는 DELETE 문이 동시 업데이트와의 충돌을 감지하면 Oracle Database는 SAVEPOINT에 대한 투명한 롤백을 수행하고 업데이트를 다시 시작합니다. 문이 성공적으로 완료되기 전에 여러 번 발생할 수 있습니다. 명령문이 다시 시작될 때마다 BEFORE 문 트리거가 다시 발생합니다. savepoint에 대한 롤백은 트리거에서 참조되는 패키지 변수에 대한 변경 내용을 취소하지 않습니다. 패키지에는 이 상황을 감지하는 카운터 변수가 포함되어야 합니다.
다음 섹션에서는 이 예제를 사용하여 트리거의 일부를 지정하는 방법을 보여 줍니다. 개체에 두 개 이상의 트리거를 만들 수 있습니다. 이벤트가 두 개 이상의 트리거를 발생하면 순서가 정의되지 않으며 특정 순서로 트리거가 발생되는 트리거에 의존해서는 안 됩니다. 이 트리거는 자체 참조 테이블(기본/고유 키와 외래 키가 있는 테이블)에서는 작동하지 않습니다. 또한 이 트리거는 트리거가 순환하는 것을 허용하지 않습니다(예: A는 A를 발사합니다). DDL 문은 트리거 본문에서 허용되지 않습니다. 또한 트리거에는 트랜잭션 제어 문이 허용되지 않습니다. 롤백, 커밋 및 저장 포인트를 사용할 수 없습니다. 시스템 트리거의 경우 {CREATE/ALTER/DROP} 테이블 문및 ALTER…COMPILE가 허용됩니다. 이 문제를 방지하려면 기본 키를 변경하고 기존 기본 키 값을 다시 사용하는 p로 하는 multirow 업데이트를 금지해야 합니다.
또한 어떤 외래 키 값이 이미 업데이트되었는지 추적한 다음 행이 두 번 업데이트되지 않도록 트리거를 수정하여 해결할 수도 있습니다. 선언적 참조 무결성 제약 조건은 분산 데이터베이스의 다른 노드의 테이블 간에 지원되지 않으므로 원격 노드에 액세스하는 트리거에는 변경 테이블 제한이 적용되지 않습니다.