카테고리 보관물: Sql

sql

존재하지 않는 구속 조건을 삭제할 수 없으며 작성할 수 없습니다. 예상대로 작동했습니다). ORA-02443

프로덕션 데이터 사본으로 일부 마이그레이션 스크립트를 테스트하는 동안 (스크립트는 개발 데이터에서 제대로 실행 됨) 흥미로운 상황을 발견했습니다. 제약 조건이 변경되어 DROP + ADD 명령을 발행합니다.

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;

ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
    CONTROL_ID,
    CALLE_AYTO_DUPL
)
ENABLE;

DROP 명령은 제대로 작동했지만 ADD 명령은 실패했습니다. 이제 나는 악순환에 빠졌습니다. 제약 조건이 없기 때문에 제약 조건을 삭제할 수 없습니다 (초기 드롭이 예상대로 작동했습니다).

ORA-02443 : 제약을 드롭 할 수 없습니다-존재하지 않는 제약

이름이 이미 있기 때문에 만들 수 없습니다.

ORA-00955 : 기존의 오브젝트가 이미 사용하고있는 이름

A_DUP_CALLE_UK1SQL Developer의 검색 상자에 입력 하면 …입니다! 소유자, 테이블 이름, tablescape … 모든 경기 : 그것은 같은 이름의 다른 개체가 아닙니다, 그것은 이다 내 원래 제약. 테이블이 제한 조건 세부 사항에 나타나지만 제한 조건이 테이블의 세부 사항에 나타나지 않습니다.

내 질문 :

  • 이에 대한 설명은 무엇입니까?
  • 라이브 서버에서 실제 업그레이드를 수행 할 때 발생하지 않도록하려면 어떻게해야합니까?

(서버는 10g XE이며 태그를 생성 할만큼 평판이 부족합니다.)



답변

추측에 따르면 Marian이 옳고 같은 이름을 가진 고유 색인 및 제약 조건으로 인해 발생합니다.

create table t( k1 integer, k2 integer,
                constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
                constraint u2 unique(k2,k1) using index u1);

select count(*) from user_indexes where index_name='U1';

COUNT(*)
---------------------- 
1

alter table t drop constraint u1;

select count(*) from user_indexes where index_name='U1';

COUNT(*)
---------------------- 
1  

일반적으로 고유 제한 조건을 추가하면 동일한 이름의 고유 색인이 작성되지만 색인과 제한 조건은 동일하지 않습니다. 에서보세요 all_indexes라는 인덱스가 있는지 A_DUP_CALLE_UK1당신이 그것을 드롭하기 전에이 뭔가에 의해 사용되는 경우에서 시도하고 그림!


답변

매우 이상해 보인다.

당신은 실행할 수 있습니다 :

 SELECT *
 FROM user_objects
 WHERE object_name = 'A_DUP_CALLE_UK1'

오라클이 어떤 종류의 객체에 대해 불평하는지 확인합니다. 그런 다음 해당 DROP 문을 실행할 수 있습니다.

내가 생각할 수있는 유일한 다른 것은 DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS해당 테이블에 속한 모든 것을 제거하고 완전히 다시 만드는 데 사용하는 테이블을 완전히 삭제하는 것입니다.

테이블에 유용한 데이터가 포함 된 경우 다음을 수행하기 전에 백업 할 수 있습니다.

CREATE TABLE old_data
AS
SELECT *
FROM A_DUP_CALLE;

테이블을 다시 만든 후에는 할 수 있습니다

INSERT INTO A_DUP_CALLE (col1, col2, col3)
SELECT col1, col2, col3
FROM old_data

데이터를 복원합니다.


답변

몇 분 전에 같은 문제가 있었는데 설명을 찾았습니다.

Oracle은 기본 키를 생성하여 제약 조건과 “UNIQUE”부분을 제어하는 ​​인덱스라는 두 가지 객체를 만듭니다.

제약 조건을 삭제하면 동일한 이름의 인덱스를 사용하여 인덱스가 그대로 유지되므로

alter table t drop constraint u1;

구속 조건 만 삭제합니다. 인덱스를 삭제하려면 다음을 실행해야합니다.

drop index u1;

이것은 일을해야합니다. 또는 명령을 사용하여 두 명령을 동시에 수행 할 수 있습니다

alter table t drop constraint u1 including indexes;

답변

기본 키 제약 조건에는 인덱스가 있습니다. 제약 조건은 삭제하지만 색인은 삭제하지 않습니다. 검사:

select * from ALL_OBJECTS where OBJECT_NAME = 'PK_TBL_CONSTR';

당신은 볼 OBJECT_TYPEIS를 INDEX.

두 가지 모두를 수행하십시오.

alter table TBL drop constraint PK_TBL_CONSTR;
drop index PK_TBL_CONSTR;

답변

이 작업을 수행

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT "A_DUP_CALLE_UK1";

작동합니다.

영상:


답변