2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : F.39. SPI - 서버 프로그래밍 인터페이스 젠 토토/예제버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.34. 스파이

스피모듈은 여러 가지를 제공합니다 를 사용하는 실행 가능한 예토토 사이트 : 문서 : 9 (SPI) 그리고 트리거. 이러한 기능은 그 자체로 어느 정도 가치가 있지만 맞습니다. 직접 수정하는 예제로 사용하면 훨씬 더 유용합니다. 목적. 기능은 어떤 용도로든 사용할 수 있을 정도로 일반적입니다. 하지만 롤 토토과 필드 이름을 지정해야 합니다(설명된 대로). 아래) 트리거를 생성하는 동안

아래에 설명된 각 기능 그룹은 별도로 설치 가능한 확장 프로그램입니다.

F.34.1. 개조하다 — 참조 무결성 구현을 위한 함수

check_primary_key()그리고check_foreign_key()확인하는 데 사용됩니다. 외래 키 제약 조건. (이 기능은 오래전부터 물론 내장된 외래 키 메커니즘으로 대체되었지만 모듈은 여전히 예로서 유용합니다.)

check_primary_key()다음을 확인합니다 참조 테이블. 사용하려면 다음을 생성하세요.이전 삽입 또는 업데이트롤 토토에서 이 함수를 사용하여 트리거 다른 롤 토토을 참조합니다. 트리거 인수로 지정합니다. 외래 키를 형성하는 롤 토토의 열 이름을 참조합니다. 참조된 롤 토토 이름, 참조된 롤 토토의 열 이름 기본/고유 키를 형성합니다. 여러 외래 키를 처리하려면 각 참조에 대한 트리거를 만듭니다.

check_foreign_key()다음을 확인합니다 참조된 테이블. 사용하려면 다음을 생성하세요.이전 삭제 또는 업데이트롤 토토에서 이 함수를 사용하여 트리거 다른 롤 토토에서 참조됩니다. 트리거 인수로 지정합니다. 함수가 수행해야 하는 참조 롤 토토 수 확인, 참조 키가 발견되면 작업(계단식— 참조 행을 삭제하려면,제한— 키를 참조하는 경우 트랜잭션을 중단합니다. 존재한다,setnull— 참조 키 설정 필드를 null로), 트리거된 테이블의 열 이름은 기본/고유 키, 참조 테이블 이름 및 열 이름(에 의해 지정된 수만큼 참조 테이블에 대해 반복됨) 첫 번째 주장). 기본/고유 키 열은 다음과 같아야 합니다. NOT NULL로 표시되었으며 고유 인덱스가 있어야 합니다.

다음에 예가 있습니다.refint.example.

F.34.2. timetravel — 시간 여행을 구현하기 위한 함수

오래 전,포스트그레SQL이 있었습니다 삽입 및 삭제 시간을 유지하는 시간 여행 기능 내장 각 튜플에 대해. 이는 이러한 기능을 사용하여 에뮬레이트할 수 있습니다. 사용하려면 이러한 함수를 사용하려면 롤 토토에 두 개의 열을 추가해야 합니다.절대튜플이 생성된 날짜를 저장하려면 입력하세요. 삽입(start_date) 및 변경/삭제(stop_date):

테이블 생성 mytab(
        ... ...
        start_date 절대 시간,
        stop_date 절대 시간
        ... ...
);

열의 이름은 원하는 대로 지정할 수 있지만 이 항목에서는 토론에서는 start_date 및 stop_date라고 부르겠습니다.

새 행이 삽입되면 일반적으로 start_date는 다음으로 설정되어야 합니다. 현재 시간, stop_date to무한대. 트리거는 다음과 같은 경우 자동으로 이 값을 대체합니다. 삽입된 데이터에는 이러한 열에 Null이 포함되어 있습니다. 일반적으로 삽입하면 이 열의 null이 아닌 명시적인 데이터는 다음 경우에만 수행되어야 합니다. 덤프된 데이터를 다시 로드하는 중입니다.

stop_date가 다음과 같은 튜플무한대아르"지금 유효합니다"이며 수정될 수 있습니다. 유한한 stop_date를 갖는 튜플은 더 이상 수정할 수 없습니다. 방아쇠가 그것을 방지합니다. (그렇게 해야 한다면 끌 수 있습니다. 아래와 같이 시간 여행을 합니다.)

수정 가능한 행의 경우 튜플의 stop_date만 업데이트합니다. 업데이트되는 내용은 (현재 시간으로) 변경되고 새 튜플이 생성됩니다. 수정된 데이터가 삽입됩니다. 이 새로운 내용의 Start_date 튜플은 현재 시간으로 설정되고 stop_date는로 설정됩니다.무한대.

삭제는 실제로 튜플을 제거하지 않고 튜플을 설정만 합니다. stop_date부터 현재 시간까지.

튜플을 쿼리하려면"지금 유효합니다", 포함stop_date = '무한대'에 쿼리의 WHERE 조건입니다. (이를 보기.) 마찬가지로 과거 어느 시점에나 유효한 튜플을 쿼리할 수 있습니다. start_date 및 stop_date에 적합한 조건이 있어야 합니다.

시간여행()장군입니다 이 동작을 지원하는 트리거 함수입니다. 생성하기삽입, 업데이트 또는 삭제 전이것을 사용하여 트리거 각 시간 이동 롤 토토에 대한 함수입니다. 두 개의 트리거 지정 인수: start_date 및 stop_date의 실제 이름 열. 선택적으로 1~3개의 추가 인수를 지정할 수 있습니다. 유형의 열을 참조해야 합니다.텍스트. 는 트리거는 현재 사용자의 이름을 첫 번째 항목에 저장합니다. INSERT 중 이 열, UPDATE 중 두 번째 열, DELETE 중 세 번째입니다.

set_timetravel()당신은 다음을 할 수 있습니다 테이블에 대한 시간 여행을 켜거나 끕니다.set_timetravel('mytab', 1)롤 토토에 대해 TT를 ON으로 설정합니다마이탭. set_timetravel('mytab', 0)다음 기간 동안 TT를 끄겠습니다. 테이블마이탭. 두 경우 모두 이전 상태 보고됩니다. TT가 꺼져 있는 동안 start_date를 수정할 수 있으며 stop_date 열을 자유롭게 사용할 수 있습니다. 켜기/끄기 상태는 로컬에 따라 달라집니다. 현재 데이터베이스 세션 — 새로운 세션은 항상 시작됩니다 모든 테이블에 대해 TT ON을 사용합니다.

get_timetravel()TT를 반환합니다. 롤 토토을 변경하지 않고 상태를 유지합니다.

다음에 예가 있습니다.timetravel.example.

F.34.3. autoinc — 필드 자동 증가를 위한 함수

자동 증가()는 저장하는 트리거입니다. 시퀀스의 다음 값을 정수 필드로 변환합니다. 이것은 일부 내장과 겹침"연재물 열"기능이지만 동일하지 않습니다.자동 증가()대체 시도를 무시합니다. 삽입하는 동안 다른 필드 값이 필요하며 선택적으로 사용할 수 있습니다. 업데이트 중에도 필드를 증가시킵니다.

사용하려면 다음을 만드세요.삽입 전(또는 선택적으로삽입 또는 업데이트 전) 이 기능을 사용하여 트리거합니다. 두 개의 트리거 인수를 지정합니다. 수정할 정수 열의 이름, 값을 제공할 시퀀스 객체입니다. (실제로는 지정할 수 있습니다. 더 많은 것을 업데이트하려는 경우 해당 이름의 쌍 수 하나 이상의 자동 증가 열.)

다음에 예가 있습니다.autoinc.example.

F.34.4. insert_username — 누가 변경했는지 추적하는 함수 표

insert_username()트리거입니다 현재 사용자의 이름을 텍스트 필드에 저장합니다. 이것은 특정 행을 마지막으로 수정한 사람을 추적하는 데 유용합니다. 테이블.

사용하려면 다음을 생성하세요.삽입 전및/또는업데이트이 함수를 사용하여 트리거합니다. 단일 트리거 인수 지정: 텍스트 열의 이름 수정될 수 있습니다.

다음에 예가 있습니다.insert_username.example.

F.34.5. moddatetime — 마지막 수정 사항을 추적하는 함수 시간

moddatetime()트리거는 다음과 같습니다. 현재 시간을 a에 저장합니다.타임스탬프필드. 이는 마지막 수정 시간을 추적하는 데 유용할 수 있습니다. 테이블 내의 특정 행에 대한 정보입니다.

사용하려면 다음을 만드세요.업데이트 전트리거 이 기능을 사용합니다. 단일 트리거 인수 지정: 이름 수정할 열입니다. 열은 유형이어야 합니다.타임스탬프또는시간이 포함된 타임스탬프 구역.

다음에 예가 있습니다.moddatetime.example.