이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 41.10. 메이저 토토 사이트 기능버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

41.10. 무지개 토토 기능#

pl/pgsql데이터 변경 또는 데이터베이스 이벤트에서 무지개 토토 기능을 정의하는 데 사용할 수 있습니다. 무지개 토토 함수는로 생성됩니다.기능 만들기명령, 인수가없고 반환 유형의 함수로 선언무지개 토토(데이터 변경 무지개 토토 용) 또는event_trigger(데이터베이스 이벤트 무지개 토토 용). 특별 지역 변수 이름TG_뭔가통화를 유발 한 조건을 설명하기 위해 자동으로 정의됩니다.

41.10.1. 데이터 변경에 대한 무지개 토토#

a토토 꽁 머니 : 문서 :인수가없고 반환 유형의 함수로 선언됩니다무지개 토토. 에 명시된 일부 인수를받을 것으로 예상되는 경우에도 기능은 인수없이 선언되어야합니다.무지개 토토 만들기- 그러한 인수는를 통해 전달됩니다TG_ARGV, 아래 설명 된대로

언제pl/pgsql함수를 무지개 토토라고하며, 여러 특수 변수는 최상위 블록에서 자동으로 생성됩니다. 그들은 :

NEW 레코드 #

새로운 데이터베이스 행삽입/업데이트로드 레벨 트리거의 작동. 이 변수는 명령문 수준 무지개 토토가 무효이며삭제운영.

old 레코드 #

Old Database Row for업데이트/삭제로드 레벨 트리거의 작동. 이 변수는 명령문 수준 무지개 토토가 무효이며삽입운영.

tg_name 이름 #

발사 된 방아쇠의 이름.

TG_WHEN 텍스트 #

, 이후또는대신14926_14968

tg_level 텍스트 #

Row또는진술15293_15335

TG_OP 텍스트 #

무지개 토토가 발사 된 작업 :삽입, 업데이트, 삭제또는Truncate.

TG_RELID OID(참조pg_class.OID) #

무지개 토토 호출을 일으킨 테이블의 객체 ID.

tg_relname 이름 #

무지개 토토 호출을 일으킨 테이블. 이것은 이제 더 이상 사용되지 않으며 향후 릴리스에서 사라질 수 있습니다. 사용tg_table_name대신.

tg_table_name 이름 #

무지개 토토 호출을 일으킨 테이블.

tg_table_schema 이름 #

무지개 토토 호출을 일으킨 테이블 스키마

tg_nargs Integer #

무지개 토토 함수에 주어진 인수 수무지개 토토 만들기진술.

TG_ARGV 텍스트 [] #

무지개 토토 만들기진술. 인덱스는 0에서 카운트합니다. 유효하지 않은 인덱스 (0보다 작거나tg_nargs) null 값을 초래합니다.

무지개 토토 함수는 어느 쪽이든 반환해야합니다NULL또는 테이블의 구조를 가진 레코드/행 값은 무지개 토토가 발사되었습니다.

로드 레벨 무지개 토토 발사NULL을 반환하여 무지개 토토 관리자 에게이 행의 나머지 작업을 건너 뛰도록 신호를 보낼 수 있습니다 (즉, 후속 무지개 토토가 발사되지 않으며삽입/업데이트/삭제이 행에는 발생하지 않습니다). unnull 값이 반환되면 작업은 해당 행 값으로 진행됩니다. 원래 값과 다른 행 값을 반환NEW삽입 또는 업데이트 될 행을 변경합니다. 따라서 무지개 토토 함수가 무지개 토토 조치가 행 값을 변경하지 않고 정상적으로 성공하기를 원한다면NEW(또는 동일한 값)를 반환해야합니다. 저장 될 행을 변경하려면 직접 단일 값을 대체 할 수 있습니다NEW수정 된 반환NEW, 또는 반환 할 완전한 새 레코드/행을 구축합니다. 전 트리거의 경우삭제, 반환 된 값은 직접적인 영향을 미치지 않지만 무지개 토토 조치를 진행할 수 있도록 unnull이어야합니다. 참고NEW삭제무지개 토토, 따라서 반환하는 것은 일반적으로 합리적이지 않습니다. 일반적인 관용구삭제무지개 토토는 반환됩니다old.

대신무지개 토토 (항상로드 레벨 무지개 토토이며 시야에서만 사용될 수 있음)는 NULL을 반환하여 업데이트를 수행하지 않았 으며이 행의 나머지 작업이 건너 뛰어야한다는 신호를 반환 할 수 있습니다.삽입/업데이트/삭제). 그렇지 않으면 무지개 토토가 요청 된 작업을 수행했음을 알리려면 unnull 값을 반환해야합니다. 을 위한삽입and업데이트​​운영, 반환 값은이어야합니다.NEW, 무지개 토토 함수가 지원하도록 수정할 수있는반환 삽입and업데이트 반환(이것은 후속 무지개 토토에게 전달 된 행 값에도 영향을 미치거나 특별한 사람에게 전달됩니다제외AN 내 별명 참조삽입성명서충돌시 업데이트절). 을 위한삭제운영, 반환 값은이어야합니다.old.

로드 레벨 트리거의 반환 값이 발사되었습니다이후또는 명령문 수준 무지개 토토 발사또는이후항상 무시됩니다. 그것은 널가 될 수도 있습니다. 그러나 이러한 유형의 무지개 토토 중 하나는 오류를 제기하여 여전히 전체 작업을 중단 할 수 있습니다.

예 41.3무지개 토토 함수의 예를 보여줍니다pl/pgsql.

예 41.3. 에이pl/pgsql무지개 토토 함수

이 예제 무지개 토토는 테이블에 행이 삽입되거나 업데이트 될 때마다 현재 사용자 이름과 시간이 행에 찍혀 있는지 확인합니다. 그리고 직원의 이름이 주어지고 급여가 긍정적 인 가치인지 확인합니다.

테이블 emp 생성 (
    Empname 텍스트,
    급여 정수,
    last_date timestamp,
    last_user 텍스트
);

function emp_stamp ()를 $ emp_stamp $로 무지개 토토로 반환합니다
    시작하다
        - empname과 월급이 주어 졌는지 확인하십시오
        new.empname이 null이라면 그렇다면
            'empname은 null이 될 수 없다'는 예외를 높이십시오.
        끝 IF;
        New.salary가 null이라면
            '%는'%가 널 급여를 가질 수 없다 ', new.empname;
        끝 IF;

        - 그들이 지불해야 할 때 누가 우리를 위해 일합니까?
        새로운.salary <0이라면
            '%는'%가 부정적인 급여를 가질 수 없습니다 ', new.empname;
        끝 IF;

        - 누가 급여를 바꾸 었는지 기억하십시오
        new.last_date : = current_timestamp;
        new.last_user : = current_user;
        새로운 반환;
    끝;
$ emp_stamp $ language plpgsql;

EMP에 삽입하거나 업데이트하기 전에 Trigger Emp_stamp를 만듭니다
    각 행에 대해 execute function emp_stamp ();

테이블 로그를 로그하는 또 다른 방법에는 각각 삽입, 업데이트 또는 삭제에 대해 행을 보유하는 새 테이블을 작성하는 것이 포함됩니다. 이 접근법은 테이블에 대한 감사 변경으로 생각할 수 있습니다.예 41.4감사 무지개 토토 기능의 예를 보여줍니다pl/pgsql.

예 41.4. 에이pl/pgsql감사를위한 무지개 토토 함수

이 예제 무지개 토토는에서 행을 삽입, 업데이트 또는 삭제하는지 확인합니다.emp테이블이 기록되어 있습니다 (예 : 감사)emp_audit테이블. 현재 시간과 사용자 이름은 수행 된 작업 유형과 함께 행에 찍혀 있습니다.

테이블 emp 생성 (
    embname 텍스트가 null,
    급여 정수
);

테이블 작성 emp_audit (
    char (1) null이 아닌 작전,
    스탬프 타임 스탬프가 널 있지 않음,
    userID 텍스트는 null이 아닙니다.
    embname 텍스트가 null,
    급여 정수
);

함수 process_emp_audit ()를 $ emp_audit $로 반환합니다
    시작하다
        -
        - EMP에서 수행 된 작업을 반영하기 위해 EMP_AUDIT에서 행을 만듭니다.
        - 특수 변수 TG_OP를 사용하여 작업을 수행합니다.
        -
        if (tg_op = 'delete') 그러면
            emp_audit에 삽입 'd', now (), current_user, old.*;
        elsif (tg_op = 'update')
            emp_audit에 삽입 'u', now (), current_user, new.*;
        elsif (tg_op = 'insert')
            emp_audit에 삽입 'i', now (), current_user, new.*;
        끝 IF;
        널 리턴; - 결과는 방아쇠 이후에 무시됩니다.
    끝;
$ emp_audit $ 언어 plpgsql;

무지개 토토 emp_audit을 만듭니다
EMP에 삽입 또는 업데이트 또는 삭제 후
    각 행에 대해 execute function process_emp_audit ();

이전 예제의 변형은 메인 테이블을 감사 테이블에 연결하는 뷰를 사용하여 각 항목이 마지막으로 수정되었을 때를 표시합니다. 이 접근법은 여전히 ​​테이블 변경의 전체 감사 트레일을 기록하지만 감사 트레일의 단순화 된 관점을 제시하여 각 항목에 대한 감사 트레일에서 파생 된 마지막 수정 된 타임 스탬프 만 보여줍니다..예 41.5뷰에서 감사 트리거의 예를 보여줍니다pl/pgsql.

예 41.5. 에이pl/pgsql감사를위한 무지개 토토 기능보기

이 예제는보기에서 무지개 토토를 사용하여 업데이트 가능하게 만들고보기에서 행을 삽입, 업데이트 또는 삭제하는지 확인하십시오 (즉, 감사)emp_audit테이블. 현재 시간과 사용자 이름은 수행 된 작업 유형과 함께 기록되며, View는 각 행의 마지막 수정 시간을 표시합니다.

테이블 emp 생성 (
    empname 텍스트 기본 키,
    급여 정수
);

테이블 작성 emp_audit (
    char (1) null이 아닌 작전,
    userID 텍스트는 null이 아닙니다.
    embname 텍스트가 null,
    급여 정수,
    스탬프 타임 스탬프가 널 있지 않습니다
);

View emp_view as를 만듭니다
    e.empname 선택,
           E.Salary,
           last_updated로 max (ea.stamp)
      emp e
      eam.empname = e.empname에서 emp_audit ea에 가입합니다
     1, 2에 의해 그룹;

기능을 만들거나 바꾸십시오. update_emp_view () 무지개 토토를 $$로 반환합니다
    시작하다
        -
        - EMP에서 필요한 작업을 수행하고 EMP_AUDIT에서 행을 만듭니다.
        - EMP에 대한 변화를 반영합니다.
        -
        if (tg_op = 'delete') 그러면
            empname = old.empname;
            찾을 수없는 경우 NULL을 반환하십시오. 끝 IF;

            old.last_updated = now ();
            emp_audit 값 ( 'd', current_user, old.*)에 삽입;
            옛날 복귀;
        elsif (tg_op = 'update')
            EMP 업데이트 SET SALARY = NEW.SALARY WHER EMPNAME = OLD.EMPNAME;
            찾을 수없는 경우 NULL을 반환하십시오. 끝 IF;

            new.last_updated = now ();
            emp_audit 값 ( 'u', current_user, new.*)에 삽입;
            새로운 반환;
        elsif (tg_op = 'insert')
            EMP 값에 삽입 (New.empname, New.salary);

            new.last_updated = now ();
            emp_audit 값에 삽입 ( 'i', current_user, new.*);
            새로운 반환;
        끝 IF;
    끝;
$$ 언어 plpgsql;

무지개 토토 emp_audit을 만듭니다
emp_view에 삽입하거나 업데이트하거나 삭제하는 대신
    각 행에 대해 execute function update_emp_view ();

무지개 토토를 한 번 사용하는 것은 다른 테이블의 요약 테이블을 유지하는 것입니다. 결과 요약은 특정 쿼리에 대해 원래 테이블 대신에 사용될 수 있습니다. 종종 실행 시간이 크게 줄어 듭니다. 이 기술은 일반적으로 측정 또는 관찰 된 데이터 (사실 테이블)의 테이블이 매우 클 수있는 데이터웨어 하우징에 일반적으로 사용됩니다.예 41.6무지개 토토 함수의 예를 보여줍니다pl/pgsql데이터웨어 하우스의 사실 테이블에 대한 요약 테이블을 유지하는 것.

예 41.6. 에이PL/PGSQL요약 테이블을 유지하기위한 무지개 토토 함수

여기에 자세히 설명 된 스키마는 부분적으로입니다.식료품 점예제데이터웨어 하우스 툴킷By Ralph Kimball.

-
- 메인 테이블 - 시간 차원 및 판매 사실.
-
테이블 생성 time_dimension (
    time_key 정수가 null,
    day_of_week 정수 NOT NULL,
    day_of_month Integer Not Null,
    월 정수가 널이 아닌
    쿼터 정수는 null이 아닙니다.
    연도 정수는 null이 아닙니다
);
time_dimension (time_key)에서 고유 한 색인 time_dimension_key를 만듭니다.

테이블 생성 sales_fact (
    time_key 정수가 null,
    Product_key Integer Not Null,
    store_key 정수 NOT NULL,
    득
    Unit_Sold Integer Not Null,
    숫자 숫자 숫자 (12,2)는 널 not
);
sales_fact (time_key)에서 색인 sales_fact_time을 만듭니다.

-
- 요약 테이블 - 시간별 판매.
-
테이블 생성 sales_summary_bytime (
    time_key 정수가 null,
    득
    Unit_SOLD 숫자 (12) NOT NULL,
    aMond_cost 숫자 (15,2)는 null이 아닙니다
);
sales_summary_bytime (time_key)에서 고유 한 인덱스 sales_summary_bytime_key 만들기;

-
- 기능 및 무지개 토토는 업데이트, 삽입, 삭제시 요약 된 열을 수정합니다.
-
기능을 만들거나 교체합니다
$ maint_sales_summary_bytime $입니다
    선언하다
        delta_time_key 정수;
        delta_amount_sold 숫자 (15,2);
        delta_units_sold 숫자 (12);
        delta_amount_cost 숫자 (15,2);
    시작하다

        - 증분/감소량을 계산하십시오.
        if (tg_op = 'delete') 그러면

            delta_time_key = old.time_key;
            delta_amount_sold = -1 * old.amount_sold;
            delta_units_sold = -1 * old.units_sold;
            delta_amount_cost = -1 * old.amount_cost;

        elsif (tg_op = 'update')

            - time_key를 변경하는 업데이트 금지 -
            - (Delete + Insert가 가장 많이
            - 변경이 이루어집니다).
            if (old.time_key! = new.time_key) 그러면
                'Time_key의 업데이트 : % - % 허용되지 않음', 예외 제기,
                                                      old.time_key, new.time_key;
            끝 IF;

            delta_time_key = old.time_key;
            delta_amount_sold = new.amount_sold -Old.amount_sold;
            delta_units_sold = new.units_sold -Old.units_sold;
            delta_amount_cost = new.amount_cost -Old.amount_cost;

        elsif (tg_op = 'insert')

            delta_time_key = new.time_key;
            delta_amount_sold = new.amount_sold;
            delta_units_sold = new.units_sold;
            delta_amount_cost = new.amount_cost;

        끝 IF;

        - 새 값으로 요약 행을 삽입하거나 업데이트하십시오.
        << insert_update 
        고리
            SALLE_SUMMARY_BYTIME 업데이트
                set aveS_SOLD = aMber_sold + delta_amount_sold,
                    units_sold = units_sold + delta_units_sold,
                    aMber_cost = aMber_cost + delta_amount_cost
                여기서 time_key = delta_time_key;

            발견되면 insert_update를 종료합니다.

            시작하다
                sales_summary_bytime에 삽입 (
                            time_key,
                            aMber_sold,
                            Unit_Sold,
                            aMber_cost)
                    값 (
                            delta_time_key,
                            delta_amount_sold,
                            delta_units_sold,
                            delta_amount_cost
                           );

                insert_update 종료;

            예외
                그럼에도 불구하고
                    - 아무것도하지 않습니다
            끝;
        엔드 루프 insert_update;

        널 리턴;

    끝;
$ maint_sales_summary_bytime $ 언어 plpgsql;

무지개 토토 maint_sales_summary_bytime을 만듭니다
sales_fact에서 삽입 또는 업데이트 또는 삭제 후
    각 행마다 실행 함수 maint_sales_summary_bytime ();

sales_fact 값 (1,1,1,10,3,15)에 삽입;
Sales_Fact 값 (1,2,1,20,5,35)에 삽입;
sales_fact 값에 삽입 (2,2,1,40,15,135);
Sales_Fact 값 (2,3,1,10,1,13)에 삽입;
sales_summary_bytime에서 *를 선택하십시오.
sales_fact에서 삭제하는 곳에서 product_key = 1;
sales_summary_bytime에서 *를 선택하십시오.
Sales_fack Set units_sold = units_sold * 2 업데이트;
sales _summary_bytime에서 * 선택 *

이후무지개 토토도 사용할 수 있습니다전환 테이블무지개 토토 진술에 의해 변경된 전체 행 세트를 검사합니다. 그만큼무지개 토토 만들기명령은 이름을 하나 또는 두 전환 테이블에 할당 한 다음 함수는 해당 이름을 읽기 전용 임시 테이블 인 것처럼 지정할 수 있습니다..예 41.7예를 보여줍니다.

예 41.7. 전환 테이블을 사용한 감사

이 예제는와 동일한 결과를 생성합니다.예 41.4, 그러나 모든 행에 해고되는 무지개 토토를 사용하는 대신 전환 테이블에서 관련 정보를 수집 한 후 명세서 당 한 번 발사되는 무지개 토토를 사용합니다. 호출 문이 많은 행을 수정했을 때로드 무지개 토토 접근법보다 훨씬 빠를 수 있습니다. 이후 각 종류의 이벤트에 대해 별도의 무지개 토토 선언을해야합니다.참조조항은 각 사례마다 달라야합니다. 그러나 우리가 선택한 경우 단일 무지개 토토 기능을 사용하는 것을 막지는 않습니다. (실제로 세 가지 별도의 기능을 사용하고 런타임 테스트를 피하는 것이 좋습니다TG_OP.)

테이블 emp 생성 (
    embname 텍스트가 null,
    급여 정수
);

테이블 작성 emp_audit (
    char (1) null이 아닌 작전,
    스탬프 타임 스탬프가 널 있지 않음,
    userID 텍스트는 null이 아닙니다.
    embname 텍스트가 null,
    급여 정수
);

함수 process_emp_audit ()를 $ emp_audit $로 반환합니다
    시작하다
        -
        - EMP에서 수행 된 작업을 반영하기 위해 EMP_AUDIT에서 행을 만듭니다.
        - 특수 변수 TG_OP를 사용하여 작업을 수행합니다.
        -
        if (tg_op = 'delete') 그러면
            emp_audit에 삽입하십시오
                'd', now (), current_user, o.*에서 Old_table o;
        elsif (tg_op = 'update')
            emp_audit에 삽입하십시오
                'u', now (), current_user, n.*에서 new_table n;
        elsif (tg_op = 'insert')
            emp_audit에 삽입하십시오
                'i', now (), current_user, n.*에서 new_table n;
        끝 IF;
        널 리턴; - 결과는 방아쇠 이후에 무시됩니다.
    끝;
$ emp_audit $ 언어 plpgsql;

무지개 토토 emp_audit_ins를 만듭니다
    emp에 삽입 한 후
    새 테이블을 New_table로 참조합니다
    각 문에 대해 execute function process_emp_audit ();
무지개 토토 emp_audit_upd를 만듭니다
    EMP에 대한 업데이트 후
    오래된 테이블을 new_table로 Old_table 새 테이블로 참조하십시오
    각 문에 대해 execute function process_emp_audit ();
무지개 토토 emp_audit_del을 만듭니다
    EMP에서 삭제 한 후
    오래된 테이블을 old_table로 참조합니다
    각 문에 대해 execute function process_emp_audit ();

41.10.2. 이벤트에 대한 무지개 토토#

PL/PGSQL정의에 사용될 수 있습니다PostgreSQL : 문서 : 개발 : 38 장. 이벤트 토토 결과. PostgreSQL이벤트 무지개 토토로 호출되는 함수는 인수가없고 반환 유형의 함수로 선언되어야합니다event_trigger.

언제pl/pgsql함수를 이벤트 무지개 토토라고하며, 여러 특수 변수가 최상위 블록에서 자동으로 생성됩니다. 그들은 :

tg_event 텍스트 #

이벤트 무지개 토토가 해고되었습니다.

TG_TAG 텍스트 #

무지개 토토가 발사 된 명령 태그.

예 41.8이벤트 무지개 토토 함수의 예를 보여줍니다pl/pgsql.

예 41.8. 에이pl/pgsql이벤트 무지개 토토 함수

이 예제 무지개 토토는 단순히 a를 올립니다.통지지원 된 명령이 실행될 때마다 메시지.

함수 생성 또는 교체 Snitch ()는 event_trigger를 $$로 반환합니다
시작하다
    통지 통지 'snitch : % %', tg_event, tg_tag;
끝;
$$ 언어 plpgsql;

DDL_COMMAND_START에서 이벤트 무지개 토토 Snitch 만들기 기능 Snitch ();