42.10. 메이저 토토 사이트 기능

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

42.10.1. 데이터 변경에 대한 메이저 토토 사이트

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

apl/pgsql함수는 메이저 토토 사이트라고하며, 여러 특수 변수가 최상위 블록에서 자동으로 생성됩니다. 그들은 :

NEW

데이터 유형레코드; 새 데이터베이스 행을 보유하는 변수삽입/업데이트행 수준 트리거의 작동. 이 변수는 명령문 수준 메이저 토토 사이트가 무효이며삭제운영.

old

데이터 유형레코드; 기존 데이터베이스 행을 보유하는 변수업데이트/삭제행 수준 트리거의 작동. 이 변수는 명령문 수준 메이저 토토 사이트가 무효이며삽입운영.

tg_name

데이터 유형이름; 방아쇠의 이름이 실제로 해고 된 변수.

TG_WHEN

데이터 유형텍스트; 문자열, 이후또는대신14076_14118

tg_level

데이터 유형텍스트; 둘 중 하나또는진술방아쇠의 정의에 따라

TG_OP

데이터 유형텍스트; 문자열삽입, 업데이트, 삭제, 또는Truncate메이저 토토 사이트가 발생했는지에 대한 정보.

TG_RELID

데이터 유형OID; 메이저 토토 사이트 호출을 일으킨 테이블의 객체 ID.

tg_relname

데이터 유형이름; 메이저 토토 사이트 호출을 일으킨 테이블의 이름. 이것은 이제 더 이상 사용되지 않으며 향후 릴리스에서 사라질 수 있습니다. 사용tg_table_name대신.

tg_table_name

데이터 유형이름; 메이저 토토 사이트 호출을 일으킨 테이블의 이름.

tg_table_schema

데이터 유형이름; 메이저 토토 사이트 호출을 일으킨 테이블 스키마의 이름.

tg_nargs

데이터 유형정수; 의 메이저 토토 사이트 함수에 대한 인수의 수메이저 토토 사이트 만들기진술.

tg_argv []

데이터 유형 배열텍스트; 의 논쟁메이저 토토 사이트 만들기진술. 인덱스는 0에서 카운트합니다. 유효하지 않은 인덱스 (0보다 작거나tg_nargs) 널 값을 초래합니다.

메이저 토토 사이트 함수는 중 하나를 반환해야합니다NULL또는 정확히 테이블의 구조를 가진 레코드/행 값 메이저 토토 사이트가 발사되었습니다.

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

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

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

예 42.3메이저 토토 사이트 함수의 예를 보여줍니다pl/pgsql.

예 42.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 ();

테이블 로그를 로그하는 또 다른 방법은 각 삽입, 업데이트 또는 삭제에 대해 행을 보유하는 새 테이블을 만드는 것과 관련이 있습니다. 이 접근법은 테이블에 대한 감사 변경으로 생각할 수 있습니다.예 42.4감사 메이저 토토 사이트 기능의 예를 보여줍니다.pl/pgsql.

예 42.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 ();

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

예 42.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 ();

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

예 42.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에서 * 선택 *

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

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

이 예제는와 동일한 결과를 생성합니다.예 42.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 ();

42.10.2. 이벤트에 대한 메이저 토토 사이트

pl/pgsql정의에 사용될 수 있습니다PostgreSQL : 문서. PostgreSQL이벤트 메이저 토토 사이트로 호출되는 함수는 인수가없고 반환 유형의 함수로 선언되어야합니다event_trigger.

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

tg_event

데이터 유형텍스트; 메이저 토토 사이트가 발사 된 이벤트를 나타내는 문자열.

TG_TAG

데이터 유형텍스트; 메이저 토토 사이트가 발사되는 명령 태그가 포함 된 변수.

예 42.8이벤트 메이저 토토 사이트 함수의 예를 보여줍니다pl/pgsql.

예 42.8. 에이pl/pgsql이벤트 메이저 토토 사이트 함수

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

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

DDL_COMMAND_START에서 이벤트 메이저 토토 사이트 Snitch 만들기 기능 Snitch ();

정정 제출

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