37.1. 롤 토토 동작 개요#

롤 토토는 특정 유형의 작업이 수행될 때마다 데이터베이스가 자동으로 특정 기능을 실행해야 한다는 사양입니다. 롤 토토는 테이블(파티셔닝 여부와 상관없이), 뷰, 외부 테이블에 연결할 수 있습니다.

테이블 및 외부 테이블에서 롤 토토는 이전 또는 이후에 실행되도록 정의할 수 있습니다.삽입, 업데이트또는삭제작업, 수정된 행당 한 번 또는 행당 한 번SQL진술.업데이트또한 특정 열이 언급된 경우에만 롤 토토가 실행되도록 설정할 수 있습니다.SET의 절업데이트문장. 롤 토토는 다음에 대해 실행될 수도 있습니다.잘라내기문장. 롤 토토 이벤트가 발생하면 이벤트를 처리하기 위해 적절한 시간에 롤 토토 함수가 호출됩니다.

뷰에서 대신 실행되도록 롤 토토를 정의할 수 있습니다.삽입, 업데이트또는삭제작업. 그런대신롤 토토는 보기에서 수정해야 하는 각 행에 대해 한 번씩 실행됩니다. 뷰의 기본 테이블에 필요한 수정을 수행하고, 적절한 경우 뷰에 표시될 수정된 행을 반환하는 것은 롤 토토 기능의 책임입니다. 뷰에 대한 롤 토토는 1회당 한 번씩 실행되도록 정의할 수도 있습니다.SQL문, 이전 또는 이후삽입, 업데이트또는삭제작업. 그러나 이러한 롤 토토는 다음이 있는 경우에만 실행됩니다.대신뷰를 롤 토토합니다. 그렇지 않으면 뷰를 대상으로 하는 모든 명령문은 기본 기본 테이블에 영향을 미치는 명령문으로 다시 작성되어야 하며, 그러면 실행될 롤 토토는 기본 테이블에 연결된 롤 토토입니다.

롤 토토 자체가 생성되기 전에 롤 토토 기능을 정의해야 합니다. 롤 토토 함수는 인수를 사용하지 않고 유형을 반환하는 함수로 선언되어야 합니다.롤 토토. (롤 토토 함수는 특별히 전달된 메소드를 통해 입력을 받습니다.롤 토토데이터구조, 일반적인 함수 인수 형식이 아닙니다.)

적절한 롤 토토 기능이 생성되면 롤 토토는 다음과 같이 설정됩니다.롤 토토 생성. 여러 롤 토토에 동일한 롤 토토 기능을 사용할 수 있습니다.

포스트그레SQL둘 다 제공행당롤 토토 및문별롤 토토. 행별 롤 토토를 사용하면 롤 토토 함수는 롤 토토를 실행한 문에 의해 영향을 받는 각 행에 대해 한 번씩 호출됩니다. 대조적으로, 명령문별 롤 토토는 해당 명령문의 영향을 받는 행 수에 관계없이 적절한 명령문이 실행될 때 한 번만 호출됩니다. 특히, 0개의 행에 영향을 미치는 명령문은 여전히 적용 가능한 명령문별 롤 토토를 실행하게 됩니다. 이 두 가지 유형의 롤 토토를 때때로 호출합니다.행 수준롤 토토 및문 수준각각 롤 토토됩니다. 롤 토토 대상:잘라내기행별이 아닌 명령문 수준에서만 정의할 수 있습니다.

롤 토토는 실행 여부에 따라 분류됩니다.이전, 이후또는대신에작업. 이를 다음과 같이 지칭합니다.이전롤 토토,이후롤 토토 및대신각각 롤 토토됩니다. 명령문 수준이전문이 어떤 작업을 시작하기 전에 자연스럽게 롤 토토되는 반면, 문 수준이후문의 끝부분에서 실행을 유발합니다. 이러한 유형의 롤 토토는 테이블, 뷰 또는 외부 테이블에 정의될 수 있습니다. 행 수준이전특정 행이 작업되기 직전에 실행을 롤 토토하는 반면, 행 수준이후문의 끝에서 롤 토토가 실행됩니다(단, 문 수준 이전이후롤 토토). 이러한 유형의 롤 토토는 뷰가 아닌 테이블과 외부 테이블에만 정의될 수 있습니다.대신롤 토토는 뷰에서만 정의할 수 있으며 행 수준에서만 정의할 수 있습니다. 뷰의 각 행이 작업이 필요한 것으로 식별되면 즉시 실행됩니다.

실행이후롤 토토가 다음과 같이 정의된 경우 명령문 끝이 아닌 트랜잭션 끝으로 연기될 수 있습니다.제약 롤 토토. 모든 경우에 롤 토토는 이를 롤 토토한 문과 동일한 트랜잭션의 일부로 실행되므로 문이나 롤 토토 중 하나가 오류를 발생시키는 경우 둘 다의 효과가 롤백됩니다.

만약삽입포함충돌 시 업데이트를 하세요절, 행 수준에서 가능이전 삽입그리고 나서이전 업데이트롤 토토된 행에서 실행될 롤 토토입니다. 롤 토토가 멱등성이 아닌 경우 이러한 상호 작용은 복잡할 수 있습니다.이전 삽입롤 토토는 다음에 의해 표시됩니다.이전 업데이트롤 토토(변경 사항 포함)제외됨열.

명령문 수준에 유의하세요업데이트롤 토토가 실행되는 경우충돌 시 업데이트를 하세요행이 영향을 받았는지 여부에 관계없이 지정됩니다.업데이트(대안 여부에 관계없이업데이트경로를 사용한 적이 있습니다). 안삽입그리고충돌 시 업데이트를 하세요절은 명령문 수준을 실행합니다이전 삽입먼저 롤 토토한 다음 명령문 수준이전 업데이트롤 토토, 이어서 명령문 수준이후 업데이트롤 토토 및 마지막으로 명령문 수준이후 삽입롤 토토.

상속 또는 분할 계층의 상위 테이블을 대상으로 하는 명령문은 영향을 받는 하위 테이블의 명령문 수준 롤 토토를 실행시키지 않습니다. 상위 테이블의 명령문 수준 롤 토토만 실행됩니다. 그러나 영향을 받은 하위 테이블의 행 수준 롤 토토는 실행됩니다.

만약업데이트파티션된 테이블에서 행이 다른 파티션으로 이동하게 되면 다음과 같이 수행됩니다.삭제원래 파티션에서 다음과 같이삽입새 파티션으로. 이 경우 모든 행 수준이전 업데이트롤 토토 및 모든 행 수준이전 삭제롤 토토는 원래 파티션에서 실행됩니다. 그런 다음 모든 행 수준이전 삽입롤 토토가 대상 파티션에서 실행됩니다. 이러한 모든 롤 토토가 이동 중인 행에 영향을 미칠 때 놀라운 결과가 발생할 가능성을 고려해야 합니다. 지금까지행 이후롤 토토가 우려됩니다.이후 삭제그리고이후 삽입롤 토토가 적용됩니다. 하지만이후 업데이트롤 토토는 다음 때문에 적용되지 않습니다.업데이트a로 변환되었습니다.삭제그리고삽입. 명령문 수준 롤 토토에 관한 한 다음 중 어느 것도 없습니다.삭제또는삽입행 이동이 발생하더라도 롤 토토가 실행됩니다. 오직업데이트다음에 사용된 대상 테이블에 정의된 롤 토토업데이트문이 실행됩니다.

별도의 롤 토토가 정의되지 않았습니다.병합. 대신 명령문 수준 또는 행 수준업데이트, 삭제삽입롤 토토는 명령문 수준 롤 토토의 경우)에 지정된 작업에 따라 실행됩니다.병합쿼리 및 (행 수준 롤 토토의 경우) 수행되는 작업을 확인합니다.

실행 중병합명령, 명령문 수준이전그리고이후롤 토토는 작업에 지정된 이벤트에 대해 실행됩니다.병합명령은 작업이 최종적으로 수행되는지 여부에 관계없이 실행됩니다. 이는 와 동일합니다.업데이트행을 업데이트하지 않는 명령문이지만 명령문 수준 롤 토토가 실행됩니다. 행 수준 롤 토토는 행이 실제로 업데이트, 삽입 또는 삭제될 때만 실행됩니다. 따라서 특정 유형의 작업에 대해 문 수준 롤 토토가 실행되지만 동일한 종류의 작업에 대해 행 수준 롤 토토가 실행되지 않는 것은 완전히 합법적입니다.

문별 롤 토토에 의해 호출된 롤 토토 함수는 항상 반환되어야 합니다.NULL. 행별 롤 토토에 의해 호출된 롤 토토 함수는 테이블 행(유형의 값)을 반환할 수 있습니다.힙튜플)을 호출 집행자에게 전달합니다(선택한 경우). 작업 전에 실행되는 행 수준 롤 토토에는 다음 선택 사항이 있습니다.

  • 돌아올 수 있습니다NULL현재 행에 대한 작업을 건너뜁니다. 이는 롤 토토를 호출한 행 수준 작업(특정 테이블 행의 삽입, 수정 또는 삭제)을 수행하지 않도록 실행자에게 지시합니다.

  • 행 수준의 경우삽입그리고업데이트롤 토토만, 반환된 행은 업데이트되는 행을 삽입하거나 대체할 행이 됩니다. 이를 통해 롤 토토 함수가 삽입되거나 업데이트되는 행을 수정할 수 있습니다.

행 수준이전이러한 동작 중 하나를 발생시키려는 의도가 없는 롤 토토는 전달된 것과 동일한 행을 결과로 반환하도록 주의해야 합니다(즉,신규삽입그리고업데이트롤 토토,오래된삭제롤 토토).

행 수준대신롤 토토는 둘 중 하나를 반환해야 합니다.NULL뷰의 기본 기본 테이블에서 데이터를 수정하지 않았거나 전달된 뷰 행을 반환해야 함을 나타냅니다(신규삽입그리고업데이트작업 또는오래된삭제작업). Null이 아닌 반환 값은 롤 토토가 뷰에서 필요한 데이터 수정을 수행했음을 알리는 데 사용됩니다. 이렇게 하면 명령의 영향을 받는 행 수가 증가합니다. 에 대한삽입그리고업데이트작업 전용, 롤 토토는 다음을 수정할 수 있습니다.신규행을 반환하기 전에. 그러면 반환된 데이터가 변경됩니다.반환 삽입또는업데이트 반환 중, 제공된 데이터와 정확히 동일한 데이터가 뷰에 표시되지 않을 때 유용합니다.

작업 후에 실행된 행 수준 롤 토토의 경우 반환 값이 무시되므로 반환할 수 있습니다.NULL.

생성된 열에는 몇 가지 고려 사항이 적용됩니다.저장된 생성 열은 다음 이후에 계산됩니다.이전롤 토토 및 이전이후롤 토토. 따라서 생성된 값은 다음에서 확인할 수 있습니다.이후롤 토토. 에서이전롤 토토,오래된행에는 예상한 대로 이전에 생성된 값이 포함되어 있지만신규행에는 새로 생성된 값이 아직 포함되어 있지 않으므로 액세스하면 안 됩니다. C 언어 인터페이스에서는 이 시점에서 열의 내용이 정의되지 않습니다. 더 높은 수준의 프로그래밍 언어는에 저장된 생성 열에 대한 액세스를 방지해야 합니다.신규행의 a이전롤 토토. a에서 생성된 열 값 변경이전롤 토토는 무시되며 덮어쓰게 됩니다.

동일한 관계의 동일한 이벤트에 대해 하나 이상의 롤 토토가 정의된 경우 롤 토토는 롤 토토 이름에 따라 알파벳 순서로 실행됩니다. 의 경우이전그리고대신롤 토토, 각 롤 토토에서 반환된 수정 가능성이 있는 행은 다음 롤 토토의 입력이 됩니다. 있다면이전또는대신롤 토토 반환NULL, 해당 행에 대한 작업이 중단되고 후속 롤 토토가 해당 행에 대해 실행되지 않습니다.

롤 토토 정의는 부울을 지정할 수도 있습니다.언제조건, 롤 토토가 실행되어야 하는지 확인하기 위해 테스트됩니다. 행 수준에서 롤 토토는언제조건은 행 열의 이전 및/또는 새 값을 검사할 수 있습니다. (문 수준 롤 토토도 다음을 가질 수 있습니다.언제조건이지만 이 기능은 그다지 유용하지 않습니다.) a이전롤 토토, 그언제조건은 함수가 실행되거나 실행되기 직전에 평가되므로 다음을 사용합니다.언제은 롤 토토 기능 시작 시 동일한 조건을 테스트하는 것과 크게 다르지 않습니다. 그러나,이후롤 토토, 그언제조건은 행 업데이트가 발생한 직후 평가되며 명령문 끝에서 롤 토토를 실행하기 위해 이벤트가 대기열에 있는지 여부를 결정합니다. 그래서 언제이후롤 토토의언제조건이 true를 반환하지 않으면 이벤트를 대기열에 넣거나 명령문 끝에서 행을 다시 가져올 필요가 없습니다. 이로 인해 롤 토토가 일부 행에 대해서만 실행되어야 하는 경우 많은 행을 수정하는 문의 속도가 크게 향상될 수 있습니다.대신롤 토토는 지원하지 않습니다.언제조건.

일반적으로 행 수준이전롤 토토는 삽입되거나 업데이트될 데이터를 확인하거나 수정하는 데 사용됩니다. 예를 들어,이전롤 토토는 현재 시간을 a에 삽입하는 데 사용될 수 있습니다.타임스탬프열 또는 행의 두 요소가 일치하는지 확인합니다. 행 수준이후롤 토토는 업데이트를 다른 테이블에 전파하거나 다른 테이블에 대한 일관성 검사를 수행하는 데 가장 현명하게 사용됩니다. 이러한 노동 분업의 이유는 다음과 같습니다.이후롤 토토는 행의 최종 값을 보고 있음을 확신할 수 있지만 a이전롤 토토를 실행할 수 없습니다. 다른 것이 있을 수도 있습니다이전그 이후에 발사가 시작됩니다. 롤 토토를 할 특별한 이유가 없는 경우이전또는이후, 그이전case가 더 효율적입니다. 작업에 대한 정보는 명령문이 끝날 때까지 저장할 필요가 없기 때문입니다.

롤 토토 기능이 SQL 명령을 실행하는 경우 이러한 명령은 롤 토토를 다시 실행할 수 있습니다. 이를 계단식 롤 토토라고 합니다. 캐스케이드 레벨 수에는 직접적인 제한이 없습니다. 계단식 배열로 인해 동일한 롤 토토가 재귀적으로 호출될 수 있습니다. 예를 들어,삽입롤 토토는 동일한 테이블에 추가 행을 삽입하는 명령을 실행할 수 있으며, 이로 인해삽입롤 토토가 다시 실행됩니다. 이러한 시나리오에서 무한 재귀를 방지하는 것은 롤 토토 프로그래머의 책임입니다.

외래 키 제약 조건이 참조 작업(즉, 계단식 업데이트 또는 삭제)을 지정하는 경우 해당 작업은 참조 테이블에서 일반 SQL 업데이트 또는 삭제 명령을 통해 수행됩니다. 특히, 참조 테이블에 존재하는 모든 롤 토토는 해당 변경 사항에 대해 실행됩니다. 그러한 롤 토토가 이러한 명령 중 하나의 효과를 수정하거나 차단하는 경우 최종 결과는 참조 무결성을 손상시킬 수 있습니다. 이를 방지하는 것은 롤 토토 프로그래머의 책임입니다.

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

롤 토토를 지원하는 각 프로그래밍 언어에는 롤 토토 입력 데이터를 롤 토토 기능에 사용할 수 있도록 만드는 고유한 방법이 있습니다. 이 입력 데이터에는 롤 토토 이벤트 유형이 포함됩니다(예:삽입또는업데이트) 및 다음에 나열된 모든 인수롤 토토 생성. 행 수준 롤 토토의 경우 입력 데이터에는 다음도 포함됩니다.신규삽입그리고업데이트롤 토토 및/또는오래된업데이트그리고삭제롤 토토.

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

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.