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

40.9. 토토 커뮤니티 절차

40.9.1. 데이터 변경에 대한 토토 커뮤니티

pl/pgsql정의하는 데 사용될 수 있습니다 토토 커뮤니티 절차. 토토 커뮤니티 절차가로 생성됩니다.함수 만들기명령, a로 선언합니다 인수가없는 기능 및 반환 유형토토 커뮤니티. 함수는 다음과 같이 선언해야합니다 인수가 지정된 인수를받을 것으로 예상 되더라도 논쟁은 없습니다.토토 커뮤니티 만들기- 토토 커뮤니티 인수는입니다 통과TG_ARGV11343_11366

언제pl/pgsql함수는입니다 토토 커뮤니티라고 불리는 몇 가지 특수 변수가 생성됩니다 최상위 블록에서 자동으로. 그들은 :

NEW

데이터 유형레코드; 새로운 것을 보유하는 변수 데이터베이스 행삽입/업데이트행 수준 토토 커뮤니티의 작동. 이것 변수는 명세서 수준 토토 커뮤니티에서 할당되지 않았습니다.삭제운영.

old

데이터 유형레코드; 기존을 잡고있는 변수 데이터베이스 행업데이트/삭제행 수준 토토 커뮤니티의 작동. 이것 변수는 명세서 수준 토토 커뮤니티에서 할당되지 않았습니다.삽입운영.

tg_name

데이터 유형이름; 포함하는 변수 방아쇠의 이름은 실제로 해고되었습니다.

TG_WHEN

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

tg_level

데이터 유형텍스트; 둘 중 하나Row또는성명서방아쇠의 정의에 따라

TG_OP

데이터 유형텍스트; 문자열삽입, 업데이트, 삭제또는Truncate어떤 수술을 위해 방아쇠가 발사되었습니다.

TG_RELID

데이터 유형OID; 테이블의 객체 ID 토토 커뮤니티 호출을 일으켰습니다.

tg_relname

데이터 유형이름; 테이블의 이름 토토 커뮤니티 호출을 일으켰습니다. 이것은 이제 더 이상 사용되지 않습니다 향후 릴리스에서 사라집니다. 사용tg_table_name대신.

tg_table_name

데이터 유형이름; 테이블의 이름 토토 커뮤니티 호출을 일으켰습니다.

tg_table_s토토 커뮤니티ema

데이터 유형이름; 스키마의 이름 토토 커뮤니티 호출을 일으킨 테이블

tg_nargs

데이터 유형Integer; 논쟁의 수 의 토토 커뮤니티 절차에 제공생성 방아쇠진술.

tg_argv []

데이터 유형 배열텍스트; 논쟁 에서토토 커뮤니티 만들기진술. 그만큼 인덱스 카운트 0. 유효하지 않은 인덱스 (0 또는 더 큰 인덱스 또는tg_nargs) NULL을 초래합니다 값.

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

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

대신토토 커뮤니티 (항상 로드 레벨 토토 커뮤니티, 뷰에서만 사용될 수 있음) NULL을 반환 할 수 있습니다. 업데이트를 수행하지 않았으며 나머지는 이 행의 조작 중 건너 뛰어야합니다 (즉, 후속 토토 커뮤니티는 발사되지 않으며 행은 주변의 행에 영향을받는 상태삽입/업데이트/삭제). 그렇지 않으면 unnull이 아닌 값이 있어야합니다 반환, 토토 커뮤니티가 요청 된 것을 수행했음을 알리기 위해 반품 작업. 을 위한삽입and업데이트운영, 반환 값은이어야합니다.NEW16779_16832반환 삽입and업데이트 반환(이것은 또한 행에도 영향을 미칩니다 값은 후속 토토 커뮤니티에게 전달되었습니다). 을 위한삭제운영, 반환 값은이어야합니다.old.

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

예제 40-3토토 커뮤니티 프로 시저의 예를 보여줍니다pl/pgsql.

예 40-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 Procedure Emp_stamp ();

테이블에 로그 변경하는 또 다른 방법은 새 생성과 관련이 있습니다. 각 삽입, 업데이트 또는 삭제에 대해 행을 보유하는 테이블 발생합니다. 이 접근법은 감사 변경으로 생각할 수 있습니다. 테이블.예제 40-4감사 토토 커뮤니티 절차의 예를 보여줍니다pl/pgsql.

예 40-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 (), user, old.*;
            옛날 복귀;
        elsif (tg_op = 'update')
            emp_audit에 삽입 'u', now (), 사용자, 새로운.*;
            새로운 반환;
        elsif (tg_op = 'insert')
            emp_audit에 삽입 'i', now (), user, new.*;
            새로운 반환;
        끝 IF;
        널 리턴; - 결과는 방아쇠 이후에 무시됩니다.
    끝;
$ emp_audit $ 언어 plpgsql;

토토 커뮤니티 emp_audit을 만듭니다
EMP에 삽입 또는 업데이트 또는 삭제 후
    각 행에 대해 프로 시저 Execute process_emp_audit ();

이전 예제의 변형은 메인에 결합 된 뷰를 사용합니다. 감사 테이블에 테이블, 각 항목이 마지막에있을 때 표시 수정. 이 접근법은 여전히 ​​전체 감사 트레일을 기록합니다 표로 변경되었지만 감사 트레일, 마지막으로 수정 된 타임 스탬프를 표시하는 것 각 항목에 대한 감사 트레일.예제 40-5뷰에서 감사 토토 커뮤니티의 예를 보여줍니다PL/PGSQL.

예 40-5. 에이pl/pgsql감사를위한 토토 커뮤니티 절차보기

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

테이블 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', user, old.*)에 삽입;
            옛날 복귀;
        elsif (tg_op = 'update')
            EMP 업데이트 SET SALARY = NEW.SALARY WHER EMPNAME = OLD.EMPNAME;
            찾을 수없는 경우 NULL을 반환하십시오. 끝 IF;

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

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

토토 커뮤니티 emp_audit을 만듭니다
emp_view에 삽입하거나 업데이트하거나 삭제하는 대신
    각 행에 대해 Execute Procedure update_emp_view ();

토토 커뮤니티의 사용은 다른 사람의 요약 표를 유지하는 것입니다. 테이블. 결과 요약은 원본 대신에 사용할 수 있습니다. 특정 쿼리 용 테이블 - 종종 실행 시간이 크게 줄어 듭니다. 이 기술은 일반적으로 데이터웨어 하우징에 사용됩니다. 측정 또는 관찰 된 데이터 테이블 (사실 테이블이라고 함) 매우 큰.예제 40-6토토 커뮤니티 프로 시저의 예를 보여줍니다pl/pgsqla 데이터웨어 하우스의 팩트 테이블.

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

40.9.2. 이벤트에 대한 토토 커뮤니티

pl/pgsql정의하는 데 사용될 수 있습니다 이벤트 토토 커뮤니티.PostgreSQL이벤트 토토 커뮤니티라고하는 절차를 요구합니다. 인수가없는 함수로 선언해야합니다. 의event_trigger.

언제pl/pgsql함수는입니다 이벤트 토토 커뮤니티라고 불리는 여러 특수 변수가 생성됩니다. 최상위 블록에서 자동으로. 그들은 :

tg_event

데이터 유형텍스트; 그것을 나타내는 문자열 이벤트 토토 커뮤니티가 발사되었습니다.

TG_TAG

데이터 유형텍스트; 포함하는 변수 방아쇠가 발사 된 명령 태그.

예제 40-7이벤트 토토 커뮤니티 프로 시저의 예를 표시pl/pgsql.

예 40-7. 에이PL/PGSQL이벤트 토토 커뮤니티 프로 시저

이 예제 토토 커뮤니티는 단순히 a를 올립니다.통지지원 된 명령이있을 때마다 메시지 실행.

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

DDL_COMMAND_START에서 이벤트 토토 커뮤니티 SNITC를 작성하여 프로 시리 키 ();에 실행됩니다.