37.1. 롤 토토 동작의 개요#

롤 토토는 특정 유형의 작업이 수행 될 때마다 데이터베이스가 특정 기능을 자동으로 실행 해야하는 사양입니다. 롤 토토는 테이블 (파티션 여부),보기 및 외국 테이블에 부착 할 수 있습니다.

테이블 및 외국 테이블에서 롤 토토는 전후에 실행하도록 정의 할 수 있습니다삽입, 업데이트또는삭제작동, 수정 된 행당 한 번 또는 당시 한 번SQL진술.업데이트롤 토토는 특정 열에 언급 된 경우에만 해고 될 수 있습니다set절의 조항업데이트진술. 롤 토토는 또한 발사 할 수 있습니다Truncate진술. 롤 토토 이벤트가 발생하면 트리거의 기능은 이벤트를 처리하기에 적절한 시간에 호출됩니다.

보기에서 롤 토토는 대신 실행하도록 정의 할 수 있습니다삽입, 업데이트또는삭제운영. 그런대신뷰에서 수정 해야하는 각 행에 대해 롤 토토가 한 번 시작됩니다. View의 기본 기본 테이블에 필요한 수정을 수행하는 것은 롤 토토 기능의 책임이며, 적절한 경우 수정 된 행을 뷰에 표시 할 때 반환합니다. 시야 롤 토토는 또한 한 번을 한 번 실행하도록 정의 할 수 있습니다.SQL명령문, 전후삽입, 업데이트또는삭제운영. 그러나 그러한 롤 토토는도있는 경우에만 해고됩니다.대신보기에서 롤 토토. 그렇지 않으면,보기를 타겟팅하는 모든 진술은 기본베이스 테이블에 영향을 미치는 진술로 다시 작성해야하며, 해고 될 롤 토토는베이스 테이블에 첨부 된 롤 토토입니다..

롤 토토 기능은 롤 토토 자체를 생성하기 전에 정의되어야합니다. 롤 토토 함수는 인수를 취하지 않고 반환 유형을 취하는 함수로 선언해야합니다롤 토토. (롤 토토 함수는 특수 통과를 통해 입력을 수신합니다TriggerData일반적인 기능 인수의 형태가 아닌 구조.)

적절한 롤 토토 함수가 만들어지면 롤 토토가 설정됩니다.롤 토토 만들기. 동일한 롤 토토 기능을 여러 롤 토토에 사용할 수 있습니다.

PostgreSQL둘 다 제공per-row롤 토토 및당사자 당롤 토토. 당 방향 롤 토토를 사용하면 롤 토토 기능이 롤 토토를 발사 한 명령문의 영향을받는 각 행에 대해 한 번 호출됩니다. 대조적으로, 해당 명령문의 영향을받는 행의 수에 관계없이 적절한 명령문이 실행될 때 마당 마당 롤 토토가 한 번만 호출됩니다. 특히, 제로 행에 영향을 미치는 진술은 여전히 적용 가능한 진술 당 롤 토토를 실행하게됩니다. 이 두 가지 유형의 롤 토토는 때때로라고합니다.로우 레벨롤 토토 및명령문 수준롤 토토. 롤 토토Truncaterow가 아닌 명세서 레벨에서만 정의 될 수 있습니다.

롤 토토는 또한 화재 여부에 따라 분류됩니다, 이후또는대신작업. 이것들은라고합니다.롤 토토,이후롤 토토,대신롤 토토. 진술 수준진술이 무엇이든하기 시작하기 전에 자연스럽게 발사되는 반면, 진술 수준이후성명서의 끝에서 발사를 롤 토토합니다. 이러한 유형의 롤 토토는 테이블, 뷰 또는 외국 테이블에 정의 될 수 있습니다. 줄 수준특정 행이 작동하기 직전에 발사를 롤 토토하는 반면,로드 레벨이후진술이 끝날 때 발사를 롤 토토합니다 (그러나 진술 수준 이전이후롤 토토). 이러한 유형의 롤 토토는 테이블과 외국 테이블에만 정의 될 수 있습니다.대신롤 토토는 뷰에서만 줄 수준에서만 정의 될 수 있습니다. 보기의 각 행이 작동 해야하는 것으로 식별되면 즉시 발사합니다.

AN의 실행이후롤 토토는 명세서의 끝이 아닌 거래 종료로 연기 될 수 있습니다.제약 롤 토토. 모든 경우에 롤 토토는 롤 토토와 동일한 트랜잭션의 일부로 실행되므로 진술이나 롤 토토가 오류를 일으키면 두 가지의 효과가 롤백됩니다..

IF an삽입포함충돌에서 업데이트절, 행 수준에 가능 삽입and 업데이트롤 토토링 행에서 실행되는 롤 토토. 이러한 상호 작용은 롤 토토가 Idempotent가 아닌 경우 복잡 할 수 있습니다. 삽입롤 토토는 업데이트변경 사항을 포함한 롤 토토제외열.

진술 수준에 유의업데이트롤 토토가 실행될 때충돌에서 업데이트행이의 영향을 받는지 여부에 관계없이 지정됩니다업데이트(그리고 대안에 관계없이업데이트경로가 촬영되었습니다).삽입with충돌에 대한 업데이트조항은 명령문 수준을 실행합니다 삽입먼저 롤 토토, 그 다음 명령문 수준 업데이트롤 토토, 그 다음에는 진술 수준이후 업데이트롤 토토 및 마침내 진술 수준이후 삽입롤 토토.

상속 또는 분할 계층 구조에서 부모 테이블을 대상으로하는 진술은 영향을받는 자식 테이블의 명령문 수준 롤 토토를 해고하지 않습니다. 부모 테이블의 명세서 수준 롤 토토 만 해고됩니다. 그러나 영향을받는 어린이 테이블의 행 수준 롤 토토가 해고됩니다.

IF an업데이트분할 된 테이블에서 행이 다른 파티션으로 이동하게됩니다.삭제원래 파티션에서에서삽입새 파티션으로. 이 경우 모든 줄 수준 업데이트롤 토토 및 모든 줄 수준 삭제원래 파티션에서 롤 토토가 발사됩니다. 그런 다음 모든 행 수준 삽입롤 토토는 대상 파티션에서 발사됩니다. 이 모든 롤 토토가 이동중인 행에 영향을 줄 때 놀라운 결과의 가능성을 고려해야합니다. 한After Row롤 토토가 우려됩니다.이후 삭제and이후 삽입롤 토토가 적용됩니다. 하지만이후 업데이트롤 토토는 적용되지 않기 때문에업데이트A로 변환되었습니다삭제and an삽입. 성명서 수준의 롤 토토에 관한 한,삭제또는삽입행 이동이 발생하더라도 롤 토토가 발사됩니다. 만업데이트롤 토토 롤 토토에 사용 된 대상 테이블에 정의 된 롤 토토업데이트성명서가 해고됩니다.

별도의 롤 토토가 정의되지 않습니다.병합. 대신, 명령문 수준 또는 행 수준업데이트, 삭제삽입롤 토토는 (명령문 수준 트리거의 경우)에 따라 해고됩니다.병합쿼리 및 (로드 레벨 롤 토토의 경우) 어떤 작업이 수행되는지

a병합명령, 명령문 수준and이후롤 토토는의 행동에 지정된 이벤트에 대해 해고됩니다병합행동이 궁극적으로 수행되는지 여부에 관계없이 명령. 이것은와 동일합니다.업데이트행을 업데이트하지 않는 명령문은 있지만 명세서 수준 롤 토토가 발사됩니다. 로드 레벨 롤 토토는 행이 실제로 업데이트, 삽입 또는 삭제 된 경우에만 해고됩니다. 따라서 특정 유형의 조치에 대해 명세서 수준의 롤 토토가 발사되는 반면 동일한 종류의 행동에 대해 행 수준 롤 토토가 해고되지 않는 것이 완벽합니다.

진술 당 롤 토토가 항상 반환 해야하는 롤 토토 기능null. 파악 롤 토토로 호출 된 롤 토토 기능은 테이블 행을 반환 할 수 있습니다 (유형 값Heappuple) 호출 집행자에게 그들이 선택한 경우. 작업이 다음과 같은 선택을하기 전에 발사 된로드 레벨 롤 토토 :

  • 반환 할 수 있습니다null현재 행의 조작을 건너 뜁니다. 이를 통해 집행자는 롤 토토 (특정 테이블 행의 삽입, 수정 또는 삭제)를 호출 한로드 레벨 작업을 수행하지 않도록 지시합니다..

  • Row-Level의 경우삽입and업데이트롤 토토 만, 반환 된 행은 삽입 될 행이되거나 업데이트되는 행을 교체 할 행이됩니다. 이를 통해 롤 토토 기능이 삽입 또는 업데이트되는 행을 수정할 수 있습니다.

행 수준이러한 동작 중 하나를 유발하지 않는 롤 토토 결과 결과에 따라 통과 된 동일한 행을 결과적으로 반환하기 위해주의해야합니다 (즉,NEW삽입업데이트롤 토토,old삭제롤 토토).

행 수준대신롤 토토가 반환해야합니다NULL보기의 기본 기본 테이블에서 데이터를 수정하지 않았거나 (에 전달 된 뷰 행을 반환해야 함을 나타냅니다.NEW삽입and업데이트운영 또는old삭제운영). 비 널 리턴 값은 롤 토토가 뷰에서 필요한 데이터 수정을 수행했음을 알리는 데 사용됩니다. 이로 인해 명령에 의해 영향을받는 행의 수가 증가하게됩니다. 을 위한삽입and업데이트작동 만 해당하는 롤 토토가 수정할 수 있습니다NEW반환하기 전에 행. 이것은에 의해 반환 된 데이터를 변경합니다.반환 삽입또는업데이트 반환, 뷰가 제공된 것과 동일한 데이터를 정확히 표시하지 않을 때 유용합니다.

운영 후 실행 된로드 레벨 롤 토토에 대해 반환 값이 무시되므로 반환 할 수 있습니다NULL.

일부 고려 사항은 생성 된 열에 적용됩니다.저장된 생성 열은 다음에 계산됩니다롤 토토와 전이후롤 토토. 따라서 생성 된 값은에서 검사 할 수 있습니다.이후롤 토토. 안에롤 토토,old행은 예상대로 기존 생성 된 값을 포함하지만NEW행에는 아직 새 생성 값이 포함되어 있지 않으며 액세스해서는 안됩니다. C 언어 인터페이스 에서이 시점에서 열 내용은 정의되지 않습니다. 더 높은 수준의 프로그래밍 언어는에 저장된 생성 열에 대한 액세스를 방지해야합니다.NEWa롤 토토. a에서 생성 열의 값을 변경합니다.롤 토토가 무시되고 덮어 쓸 것입니다.

동일한 관계에서 동일한 이벤트에 대해 둘 이상의 롤 토토가 정의되면 롤 토토가 롤 토토 이름으로 알파벳 순서로 발사됩니다. 의 경우and대신롤 토토, 각 롤 토토에 의해 반환 될 수있는 수정 행은 다음 롤 토토에 대한 입력이됩니다.또는대신롤 토토 리턴NULL, 해당 행에 작업이 버려지고 후속 롤 토토가 해고되지 않습니다 (해당 행).

롤 토토 정의는 부울을 지정할 수도 있습니다언제조건. 롤 토토를 발사 해야하는지 확인하기 위해 테스트됩니다. 로드 레벨에서 롤 토토언제조건은 행의 기존 및/또는 새 값을 검사 할 수 있습니다. (진술 수준 롤 토토도 가질 수 있습니다when조건, 특징은 그들에게 유용하지는 않지만.)에서.롤 토토,언제조건은 함수가 실행되거나 실행되기 직전에 평가됩니다.언제롤 토토 함수의 시작 부분에서 동일한 조건을 테스트하는 것과 실질적으로 다르지 않습니다. 그러나에서이후롤 토토,언제조건은 행 업데이트가 발생한 직후에 평가되며 명세서 끝에서 롤 토토를 발사하기 위해 이벤트가 대기되는지 여부를 결정합니다. 그래서이후Trigger 's언제조건은 TRUE를 반환하지 않으며, 이벤트를 대기하거나 성명서 끝에서 행을 다시 가져올 필요는 없습니다. 이로 인해 롤 토토가 몇 줄에 대해서만 발사되면 많은 행을 수정하는 진술에서 상당한 속도를 높일 수 있습니다.대신롤 토토는 지원하지 않습니다언제조건

일반적으로,로드 레벨롤 토토는 삽입 또는 업데이트 될 데이터를 확인하거나 수정하는 데 사용됩니다. 예를 들어, A롤 토토는 현재 시간을 A에 삽입하는 데 사용될 수 있습니다타임 스탬프열 또는 행의 두 요소가 일관되어 있는지 확인합니다. 줄 수준이후롤 토토는 다른 테이블로 업데이트를 전파하거나 다른 테이블에 대한 일관성 검사를하는 데 가장 현명하게 사용됩니다. 이 노동 분업의 이유는 때문입니다.이후롤 토토는 행의 최종 값이 보이는 반면 A롤 토토는 할 수 없습니다. 다른 것이있을 수 있습니다그 후 발사를 방지합니다. 방아쇠를 만들 이유가없는 경우또는이후, The사례는 더 효율적입니다. 성명서가 끝날 때까지 작업에 대한 정보를 저장할 필요가 없으므로

롤 토토 함수가 SQL 명령을 실행하면이 명령이 다시 롤 토토 될 수 있습니다. 이것은 계단식 롤 토토라고합니다. 캐스케이드 수준의 수에는 직접 제한이 없습니다. 캐스케이드는 동일한 트리거의 재귀 적 호출을 일으킬 수 있습니다. 예를 들어, an삽입롤 토토는 추가 행을 동일한 테이블에 삽입하는 명령을 실행하여삽입다시 해고 될 롤 토토. 그러한 시나리오에서 무한 재귀를 피하는 것은 롤 토토 프로그래머의 책임입니다.

외국 키 제약 조건이 참조 조치 (즉, 계단식 업데이트 또는 삭제)를 지정하면 해당 작업이 일반 SQL 업데이트 또는 참조 테이블에서 명령을 삭제하여 수행됩니다. 특히, 참조 테이블에 존재하는 롤 토토는 이러한 변경에 대해 해고됩니다. 이러한 롤 토토가 이러한 명령 중 하나의 효과를 수정하거나 차단하면 최종 결과는 참조 무결성을 깨뜨릴 수 있습니다. 그것을 피하는 것은 롤 토토 프로그래머의 책임입니다.

롤 토토가 정의되면 인수를 지정할 수 있습니다. 롤 토토 정의에 인수를 포함시키는 목적은 유사한 요구 사항을 가진 다른 롤 토토가 동일한 함수를 호출하도록 허용하는 것입니다. 예를 들어, 인수로서 두 개의 열 이름을 가져오고 현재 사용자를 하나의 현재 타임 스탬프에 넣는 일반화 된 롤 토토 함수가있을 수 있습니다. 올바르게 작성된이 롤 토토 기능은 롤 토토중인 특정 테이블과 무관합니다. 따라서 동일한 기능이 사용될 수 있습니다.삽입예를 들어 트랜잭션 테이블에서 레코드 생성을 자동으로 추적하려면 적절한 열이있는 테이블의 이벤트. 또한로 정의 된 경우 마지막 업데이트 이벤트를 추적하는 데 사용될 수 있습니다.업데이트롤 토토.

롤 토토를 지원하는 각 프로그래밍 언어에는 롤 토토 입력 데이터를 롤 토토 기능에 사용할 수 있도록 자체 방법이 있습니다. 이 입력 데이터에는 롤 토토 이벤트 유형이 포함됩니다 (예 :삽입또는업데이트) 및에 나열된 인수롤 토토 만들기. 로드 레벨 트리거의 경우 입력 데이터에도가 포함됩니다.NEW삽입업데이트롤 토토 및/또는old업데이트삭제롤 토토.

기본적으로 명령문 수준 롤 토토는 명세서에 의해 수정 된 개별 행을 검사 할 방법이 없습니다. 하지만이후의 명령문롤 토토가 요청할 수 있습니다전환 테이블롤 토토에 영향을받는 행 세트를 사용할 수 있도록 만들어집니다.After Row롤 토토는 전환 테이블을 요청하여 테이블의 총 변경 사항과 현재 해고중인 개별 행의 변경 사항을 볼 수 있습니다. 전환 테이블을 다시 검사하는 방법은 사용중인 프로그래밍 언어에 따라 다르지만 일반적인 접근 방식은 전환 테이블이 롤 토토 기능 내에서 발행 된 SQL 명령에 의해 액세스 할 수있는 읽기 전용 임시 테이블처럼 작용하는 것입니다..

정정 제출

문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면