2012-02-14 3 views
10

Oracle에서 테이블의 이름을 바꿔야하지만 테이블을 참조하는 외래 키, 제약 조건, 트리거 및 시퀀스가 ​​새 이름을 사용하도록 업데이트되었는지 확인하고 싶습니다.모든 외래 키, 제약 조건, 트리거 및 시퀀스가 ​​업데이트되고 기존 데이터가 보존되도록 Oracle에서 테이블의 이름을 바꾸려면 어떻게합니까?

아무 것도 깨뜨리지 않았 음을 어떻게 확인할 수 있습니까?

테이블에 들어있는 기존 데이터를 보존하려고합니다.

답변

12

"테이블을 참조하는 모든 외래 키, 제약 조건, 트리거 및 시퀀스가 ​​새 이름을 사용하도록 업데이트되었습니다."라는 의미에 따라 다릅니다.

이름이 바뀌는 테이블에 대한 기존 색인, 제한 조건 및 트리거는 자동으로 새 이름을 참조합니다.

그러나 이러한 개체에 사용 된 명명 규칙은 자동으로 업데이트 된 이름을 사용하지 않습니다. 예를 들어 TABLE_NAME의 기본 키의 이름이 일반적으로 TABLE_NAME_PK 인 경우 TABLE_NAME에서 NEW_TABLE_NAME으로 이름을 바꾸면 기본 키 제약 조건의 이름이 NEW_TABLE_NAME_PK으로 자동 변경되지 않습니다.

점검해야 할 사항은 이전 테이블 이름을 참조한 코드 패키지, 프로 시저 및 함수와 이전 테이블 이름을 참조한 트리거입니다. 마찬가지로 이전 테이블 이름에 대한 뷰도 손상됩니다. 보기 ALL_DEPENDENCIES을 사용하면 업데이트해야 할 개체를 식별 할 수 있습니다.

+0

감사합니다. Adam. @ Justin은 트리거가 올바르게 작동 할 것이라고 제안했습니다. 내가 수동으로 트리거를 수정해야한다는 말입니까? 예를 들어, 자동 증가 트리거 (CREATE TRIGGER trg_bi_foo를 삽입하기 전에 각 행 시작 SELECT seq_foo.NEXTVAL INTO : NEW.foo_id FROM DUAL; END;)에 "BEFORE INSERT ON foo"가 자동으로 "BEFORE INSERT ON bar "? –

+3

예.그러나'foo'에 대한 질의를 수행하는 다른 테이블에 다른 트리거가 있으면 그 트리거는 자동으로'bar'에 대한 쿼리로 업데이트되지 않습니다. –

18

ALTER TABLE old_table_name 
RENAME TO new_table_name; 

모든 기존 제약 (외래 키 및 기타 제약) 및 트리거가 새롭게 이름을 바꾼 개체를 참조됩니다. 시퀀스는 테이블과 아무 관계도 없으므로 시퀀스에 아무런 영향을 미치지 않습니다 (테이블의 트리거에서 시퀀스를 참조하는 경우 트리거는 이름 변경 후 동일한 시퀀스를 계속 참조합니다). 그러나 이전 테이블 이름을 참조하는 작성한 스토어드 프로 시저는 새 테이블 이름을 참조하도록 업데이트해야합니다.

이제 제약 조건과 트리거는 계속 올바르게 작동하지만 원래 이름은 그대로 유지됩니다. 테이블 이름 다음에 유지하려는 오브젝트에 대한 이름 지정 규칙이있는 경우, 더 많은 것을 수행해야합니다. 당신이 원하는 경우 예를 들어, 테이블 FOO에 삽입 트리거 전에 행 수준이 TRG_BI_FOO 명명 될 당신이 명시 적으로

ALTER TRIGGER trg_bi_foo 
    RENAME TO trg_bi_bar; 

마찬가지로 이름을 변경하는 트리거를 변경해야 할 것, BAR에 테이블의 이름을 변경, 당신은 테이블의 종속성과 데이터를 보존 할 것인가 제약 조건과 인덱스

ALTER TABLE bar 
    RENAME CONSTRAINT pk_foo TO pk_bar; 
1
ALTER TABLE oldName RENAME TO newName 

의 이름을 변경해야 할 것입니다하지만 항상 무효가 될 것입니다 이전 이름을 참조하는 PL/SQL의 조각이있을 수 있습니다.