2014-11-11 3 views
2

기존 외래 키를 "on delete restrict"에서 "on delete delete cascade"로 변경해야합니다. Unfortunaltey이 버그는 Q/A를 통해 살금 살금 들어 왔습니다.파이어 버드 : "익명"외래 키 변경

내 데이터베이스에는 자동으로 이름이 지정된 여러 가지 주요 키 관계가 있습니다 (INTEG_1, INTEG_2, ...). 해결해야 할 제약 조건의 이름은 버전 2의 업데이트보다 새로운 설치의 버전이며, 이전 버전 2에서이 버전 2를 업데이트 한 경우도 있습니다.

참조 테이블에는 하나의 외부 내가 시도, 그러나

SELECT RDB$CONSTRAINT_NAME 
FROM RDB$RELATION_CONSTRAINTS 
where RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' 
    and RDB$RELATION_NAME = 'MY_TABLE_NAME' 

그때 내가 ("진짜"이름이 시간) 드롭 이후 외래 키를 다시 만들 수 있습니다

alter table MY_TABLE_NAME 
drop constraint <result from above>; 

alter table MY_TABLE_NAME 
add constraint fk_my_table_name_purpose foreign key (other_id) 
     references other_table(id) on delete cascade; 

: 키,이 문장은 나에게 제약 조건의 이름을 제공합니다 시스템 테이블로 직접 작업하는 것을 피하기 위해 내 외래 키를 변경하는 더 나은/우아한 방법이 있는지 알고 싶습니다.

+0

"시스템 테이블에서 직접 작업하지 마시기 바랍니다 *"- 이유가 무엇입니까? 그건 파이어 버드가 표준 'INFORMATION_SCHEMA'를 가지고 있지 않기 때문에 공식적인 "API"입니다. –

+0

시스템 테이블을 DB 내부와 상호 작용할 수있는 것으로 보았지만 가능하면 안됩니다. 그러나 내 솔루션이 이미 "공식적인 방법"인 경우 ... 괜찮습니다 .-) – Chris

+1

시스템 테이블을 직접 조작하지 말라는 조언은 ** 시스템 테이블 수정 **에 관한 것입니다. Firebird에서는 기술적으로 시스템 테이블의 항목을 삽입, 업데이트 또는 삭제하여 DDL 형식을 수행 할 수 있습니다. 이것은 일련의 문제를 가지고 있기 때문에, Firebird 3는 이것을 불가능하게 만들 것입니다 (예외는 있습니다). –

답변

3

더 좋은 방법은 없습니다. 시스템 테이블은 제약 조건 이름을 알아낼 수있는 유일한 방법입니다.

+2

그리고 이것은 데이터베이스 구조에 대한 정보를 얻는 완전히 합법적 인 방법입니다. –