pl/pgsql데이터 변경 또는 데이터베이스 이벤트에서 무지개 토토 기능을 정의하는 데 사용할 수 있습니다. 무지개 토토 함수는로 생성됩니다.기능 만들기
명령, 인수가없고 반환 유형의 함수로 선언무지개 토토
(데이터 변경 무지개 토토 용) 또는event_trigger
(데이터베이스 이벤트 무지개 토토 용). 특별 지역 변수 이름TG_
통화를 유발 한 조건을 설명하기 위해 자동으로 정의됩니다.뭔가
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 ();
PL/PGSQL정의에 사용될 수 있습니다PostgreSQL : 문서 : 개발 : 38 장. 이벤트 토토 결과. PostgreSQL이벤트 무지개 토토로 호출되는 함수는 인수가없고 반환 유형의 함수로 선언되어야합니다event_trigger
.
언제pl/pgsql함수를 이벤트 무지개 토토라고하며, 여러 특수 변수가 최상위 블록에서 자동으로 생성됩니다. 그들은 :
예 41.8이벤트 무지개 토토 함수의 예를 보여줍니다pl/pgsql.
예 41.8. 에이pl/pgsql이벤트 무지개 토토 함수
이 예제 무지개 토토는 단순히 a를 올립니다.통지
지원 된 명령이 실행될 때마다 메시지.
함수 생성 또는 교체 Snitch ()는 event_trigger를 $$로 반환합니다 시작하다 통지 통지 'snitch : % %', tg_event, tg_tag; 끝; $$ 언어 plpgsql; DDL_COMMAND_START에서 이벤트 무지개 토토 Snitch 만들기 기능 Snitch ();