database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 5783 게시물 읽기
No. 5783
트리거에 관한 질문이요
작성자
초짜(kmsds)
작성일
2005-01-06 13:32ⓒ
2005-01-06 13:34ⓜ
조회수
3,708

현재 오라클DB에서 postgreSQL로 변환작업을 하고 있습니다.

오라클에서 아래와 같은 트리거를 사용하였습니다.

========================================================

create or replace trigger test_col_af_up_row
after update of col on test
for each row

Begin
=== 내용 ===

EXCEPTION

=== 예외처리 내용 ===

End;

========================================================

위의 트리거 내용을 아래와 같이 변환하였습니다.

========================================================

CREATE OR REPLACE FUNCTION func_test_col_af_up_row() RETURNS "trigger"
AS '
begin

=== 내용 ===

return null;
end;'LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER tr_test_col_af_up_row
after update on test for each row <<===== 요부분
EXECUTE PROCEDURE func_test_col_af_up_row();

========================================================

원래 트리거 내용은 test테이블의 col컬럼에 update가 생겼을때 update후에 "내용" 부분을 실행하고

에러가 났을시에는 예외처리를 하라는 내용인데,

현재 변환한 내용은 test테이블에 update가 생겼을때(col컬럼까지는 관리 못하고) update후에 "내용"부분을 실행하라

라는 내용으로 변환하였습니다.

여쭤보고자 하는것이

 

1. 위의 화살표부분에는 "after update on test for each row" 라고 쓰여있는 부분이 원래는

"after update of col on test for each row" 로 test테이블의 col 컬럼에 변화가 생겼을때만 실행이 되야하는데

거기까지 관리를 하려면 어떻게 코딩을 해야 하는지 몰라서 "of col" 부분을 제거했습니다.

현재 "of col을 추가하면 문법 오류가 납니다.

원취지대로 "of col"을 포함해서 테이블안의 컬럼까지 관리를 하려면 어떻게 해야 하나요?

 

2. 예외처리에 관해서는 어떻게 해야 하는지 몰라서 처리를 못했는데,

어떤식으로 코딩해야 하는지좀 알려주세요..

 

두서없이 질문만 마구 하는것 같아 송구스럽지만, 아시는 분들의 답변 기다리겠습니다..

감사합니당~ ^^ 꾸벅(--)(__)(--)

 

이 글에 대한 댓글이 총 3건 있습니다.

create trigger 에서

update of col 구문은 현재 지원하지 않습니다.

 

언젠가는 지원을 하겠지만, 일단 그 기능을 어떠한 방법으로도 구현할 수 없다면, 문제겠지만, 트리거함수에서 old, new row 비교로 간단히 해결할 수 있는 부분이라서 이 구문의 지원이 비교적 우선순위가 낮을 것 같네요.

 

일단 plpgsql 언어로 풀어보면,

먼저 예외처리 관련은

http://database.sarang.net/database/postgres/manual/manual-7.4/plpgsql-errors-and-messages.html

 

페이지를 참조하시면 되구요,

위의 update of column 처리는

 

트리거 함수 본문에서

if old.column <> new.column then

 ....

end if

 

이런식으로 풀어가면 됩니다.

 

----

일반 사무에서 쓰이는 대부분의 오라클 트리거나, 프로시져들은 몇가지 간단한 변경으로 거의 대부분 plpgsql로 포팅이 가능하더군요.

작업하시다가 궁금한 점이 있으시면

이곳에서 plpgsql 관련 문서를 찾아서 읽으시면 될겝니다.

 

김상기(ioseph)님이 2005-01-06 13:48에 작성한 댓글입니다.

답변 감사합니다..

말씀대로 해서 update of column  에 대한 처리를 되었는데

예외처리 관련해서 사이트를 링크해주셨는데,

봐서 이해가 잘 가지 않네여

더군다나 제가 영어는 꽝이라...

예제같은게 있음 이해가 갈듯 한데....^^

그럼 혹시..

다음의 오라클버전 예외처리를 postgreSQL로 바꾼다면

어떤식으로하면 될까요?

========================================================

EXCEPTION
  WHEN NO_DATA_FOUND THEN 
      RAISE_APPLICATION_ERROR( -20001, '구매자료 갱신 : no_data_found' ) ;
  WHEN OTHERS THEN
   RAISE_APPLICATION_ERROR( -20003, '구매 자료 갱신 : others' ) ;

========================================================

초짜(kmsds)님이 2005-01-06 17:11에 작성한 댓글입니다.

plpgsql 에서도 오라클과 비슷한데, 윗경우라면,

 

PostgreSQL에서는 update 구문의 결과로 해당 자료가 없어 어떠한 자료도 갱신한 것이 없을 경우가 "예외상황이 아닙니다"

이것 때문에,

 

plpgsql exception 구문을 사용할 수 없습니다. (8.0에서 exception 구문이 등장했는데, 이 경우에는 쓸 수가 없을 것 같네요)

 

그래서,

윗 문제는

update ....;

if not found then

  .....

end if;

이런식으로 found  체크 변수를 이용해야할 듯싶네요.

if 구문 안에 처리부분은 경로할 것인지, 오류로 할 것인지, 그냥 알림으로 할 것인지는 이 트리거의 업무특성에 따라 달라지는지라...

 

아무튼

윗 이야기를 종합해서 가상으로 트리거 함수를 꾸며보면 이런식일 것 같네요.

create function .... as '
begin
if old.col1 <> new.col1 then
  update table2 set col1 = new.col1 where col2 = old.pkcol;
  if not found then
    raise notice ''해당 자료 없어서 table2 에서는 갱신하지 않았음'';
  end if;    
end if;
end;
' language 'plpgsql';

 

이런식으로 움직일 것 같네요.

 

현재 plpgsql 쪽은 이미 쓰는 사람들이 초보 수준이 넘어서 있는 사람들인지라, 문서가 친절하지 않습니다. 스스로 읽고, 문제를 풀어가는데, 영문문서만으로도 충분하니까, 한글 문서를 만들어야겠다는 필요성을 못느끼나봅니다. :)

 

 

김상기(ioseph)님이 2005-01-06 22:48에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
5787자료형중에 point, real 에 대해서 설명 좀 해주세요. [2]
정수라
2005-01-07
2005
5786안녕하세요 [1]
김주미
2005-01-06
2027
5785테이블 join시... [2]
마법사
2005-01-06
2225
5783트리거에 관한 질문이요 [3]
초짜
2005-01-06
3708
5782서버 encoding이 uif-8인 환경에서 HTML encoding이 euc-kr인 Web 사이트 제작질문 [3]
떼송이
2005-01-06
4827
5781sp 와 query중에서 어떤 방법이 더 효율적일까요. [3]
떼송이
2005-01-05
2336
5780postgresql-8.0.0-rc2로 Window XP 설치 [1]
왕초보
2005-01-05
2457
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다