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 4544 게시물 읽기
No. 4544
테이블 변경과 Trigger 문제
작성자
이 진택
작성일
2003-01-23 07:18
조회수
1,680

안녕하세요.

 

테이블안에 있는 필드 변경에 관한 문제가 있어서 이렇게 질문 드립니다. 조금 긴데 이해해 주시고 봐주십시요.

 

테이블은....

 

create table course_transcripts (

trn_pk serial primary key,

trn_std_fk varchar(10) references registration.rypathid

on update cascade

on delete cascade,

.....

);

 

테이블의 필드, trn_std_fk을 integer (foriegn Key) 로 바꿀려고 해서 아래와 같이 했습니다.

 

Add column to course_transcripts:

ALTER TABLE course_transcripts ADD COLUMN trn_reg_fk

INTEGER REFERENCES registration.rrecnum

ON UPDATE CASCADE ON DELETE CASCADE;

 

Populate trn_reg_fk with rrecnum values corresponding to trn_std_fk rypathid values:

UPDATE course_transcripts SET trn_reg_fk = registration.rrecnum

WHERE trn_std_fk = registration.rypathid;

 

Verify that the values in trn_reg_fk are appropriate:

SELECT count(trn_pk) FROM course_transcripts, registration

WHERE trn_reg_fk = rrecnum AND trn_std_fk = rypathid;

 

Drop the course_transcripts.trn_std_fk column (this is new feature in 7.3)

ALTER TABLE course_transcripts

DROP COLUMN course_transcripts.trn_std_fk;

 

Rename the trn_reg_fk column:

ALTER TABLE course_transcripts

RENAME COLUMN trn_reg_fk TO trn_std_fk;

 

이렇게 했는데 문제가 생겼습니다. 필드, trn_std_fk을 drop했을때 이 필드와 연결된 trigger (reference key)가 같이 자동적으로 drop 되지 않는 것 같습니다. 그리고 rename을 했을때 새로 add한 trn_reg_fk에 관련된 trigger가 자동적으로 연결되지 않고 전에 있던 trn_std_fk의 trigger가 연결되는 것 같습니다.

 

어떻게 해야 되죠... 부탁드립니다.

건승하십시요.

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

글을 읽으면서, 정말 예리하게 발견해 냈군 하고 감탄을 했습니다.

 

결론부터 말씀드리면, PostgreSQL의 버그입니다.

 

위에서

ALTER TABLE course_transcripts ADD COLUMN trn_reg_fk

INTEGER REFERENCES registration.rrecnum

ON UPDATE CASCADE ON DELETE CASCADE

이부분이 제대로 작동되지 못합니다.

즉, 자료형선언 다음 뒷 부분은 모두 무시 되는듯.

 

다음 패치버전에서 수정되지 않을까 싶네요.

아니면, 막히든지.

 

아무튼 alter table add 로 칼럼이 추가 되고,

그것이 foreign key로 사용될 것이라면,

메뉴얼에 있는 대로

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address)

이런식의 foreign key를 만들어주어야할 듯싶습니다.

 

아울러,

그 foreign key를 만든 놈에 대해서

그 해당 칼럼이 rename 된다면, 그 해당 foreign key 트리거가 참조무결성 조건으로 미아가 되어버리는 군요. 이것도 PostgreSQL 버그입니다.

 

즉, 해당 constraint를 지우고, 다시 만드셔야할 듯싶네요.

 

아주 중요한 부분인데, 메뉴얼에 빠져있군요.

 

아무래도 다음번 버전에서는 카타로그 테이블 자체가 꽤 엄격한 무결성 조건을 가질 것 같네요. 이것만이 이 문제를 풀 수 있는 해결책인듯.

아니면, sql parser에서 예외규정을 많이 두든지.

 

재밌는 사실을 알려주셔서 고맙습니다.

김상기(ioseph)님이 2003-01-23 18:11에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4547pg_ctl 실행시 TCP 연결이 안됩니다. [2]
조성훈
2003-01-24
1627
4546게시판에서 페이지 나눌려면 어떤 쿼리를 써야하죠? [1]
창수
2003-01-24
1308
4545두 날짜의 차이가 몇달이 나는지 알아볼려고 합니다. [1]
고종길
2003-01-23
1376
4544테이블 변경과 Trigger 문제 [1]
이 진택
2003-01-23
1680
4543기본적인 사용자설정과 디비생성.... [2]
재학
2003-01-22
1777
4539left()가 없나요??? [2]
고종길
2003-01-17
1101
4536오라클과 같은 힌트사용이 가능한지 궁금합니다. [2]
이창욱
2003-01-17
1351
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다