Oracle DB에서 Ghost 제약 조건 찾기
테이블에 제약이 있었습니다.
CREATE TABLE "USERSAPPLICATIONS" (
"USERID" NUMBER NOT NULL ,
"APPLICATIONNAME" VARCHAR2 (30) NOT NULL ,
CONSTRAINT "PK_USERSAPPLICATIONS" PRIMARY KEY ("USERID","APPLICATIONNAME")
)
/
2주 전에 테이블을 수정하고, 몇 개의 열을 추가하고, 제약 조건 "PK_USERSAPPLICATIONS"를 삭제하고, 대리 키를 추가했습니다.Oracle SQL Developer에서 PK_USERSAPPLICATIONS 제약 조건이 더 이상 존재하지 않음을 확인할 수 있습니다.
그럼에도 불구하고 userid/applicationName 조합이 동일한 두 항목을 추가하려고 하면 오류가 발생합니다.
SQL Error: ORA-00001: unique constraint (ACCOUNTMP1.PK_USERSAPPLICATIONS) violated
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.
명령문을 실행할 때
SELECT *
FROM user_cons_columns
WHERE constraint_name = 'PK_USERSAPPLICATIONS'
열이 하나도 없어요.어떻게 그럴 수가?Oracle은 제약 조건 PK_USERSAPPLICATIONS를 이미 몇 주 전에 삭제했기 때문에 해당 제약 조건에 대한 지식이 없어야 하며 데이터베이스에서도 해당 제약 조건을 볼 수 없습니다.
당신은 그 제약 조건에 사용된 색인을 아직도 가지고 있습니까?왜냐하면 당신이 포함하지 않는 한DROP INDEX
제약 조건을 떨어트렸을 때 절은 여전히 존재합니다.시작:
SELECT *
FROM user_indexes
WHERE index_name = 'PK_USERSAPPLICATIONS'
/
대신에,
select index_name
from user_indexes
where table_name = 'USERSAPPLICATIONS'
and uniqueness='UNIQUE'
/
또는
select index_name
from user_ind_columns
where table_name = 'USERSAPPLICATIONS'
and column_name in ('USERID' ,'APPLICATIONNAME')
/
편집을
개념 증명
SQL> create table t23 (id number not null, alt_key varchar2(10) not null)
2 /
Table created.
SQL> create unique index t23_idx on t23 (id)
2 /
Index created.
SQL> alter table t23 add constraint t23_pk primary key (id) using index
2 /
Table altered.
SQL> insert into t23 values (1, 'SAM I AM')
2 /
1 row created.
SQL> insert into t23 values (1, 'MR KNOX')
2 /
insert into t23 values (1, 'MR KNOX')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_PK) violated
SQL>
그래서 제약이 작용합니다.DROP INDEX 조항 없이 드롭하면 어떻게 됩니까?
SQL> alter table t23 drop constraint t23_pk
2 /
Table altered.
SQL> insert into t23 values (1, 'MR KNOX')
2 /
insert into t23 values (1, 'MR KNOX')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_IDX) violated
SQL>
오류 메시지의 미묘한 변화에 주목합니다.두 번째 오류는 인덱스 이름을 참조하는 반면, 원본 메시지는 제약 조건을 참조합니다.인덱스 이름이 제약 조건 이름과 같으면 이를 진단하기가 어렵습니다.
고유 인덱스를 명시적으로 사전 생성하지 않는 경우 Oracle의 기본 동작은 고유하지 않은 인덱스를 생성하는 것입니다.따라서 인덱스를 삭제하지 않고 제약 조건을 삭제해도 이 문제가 발생하지 않습니다.(이 동작의 동굴은 11g에 해당합니다.저는 이전 버전에서도 이러한 방식이라고 추정하지만 확신할 수는 없습니다.
이 열의 인덱스를 확인해 보십시오.경우에 따라 제약 조건과 연결된 인덱스가 제약 조건 삭제 후 삭제되지 않습니다.
언급URL : https://stackoverflow.com/questions/2372163/finding-ghost-constraint-from-oracle-db
'programing' 카테고리의 다른 글
C에서 부울(부울)은 얼마나 많은 공간을 차지합니까?1비트인가요, 1바이트인가요? (0) | 2023.07.05 |
---|---|
Spring application.properties 파일에서 식 사용 (0) | 2023.07.05 |
dplyr 메시지 'summarise()' 출력을 'x'('.groups' 인수로 재정의함)로 다시 그룹화하는 것을 어떻게 해석합니까? (0) | 2023.07.05 |
원격 변경사항을 삭제하고 파일을 "해결됨"으로 표시하려면 어떻게 해야 합니까? (0) | 2023.07.05 |
Next App을 초기화하기 전에 창 너비를 가져오고 저장하는 방법은 무엇입니까? (0) | 2023.07.05 |