2013-05-31 2 views
3

참조 된 값이 참으로 참조 된 테이블에 있음에도 불구하고 사용할 수없는 참조 제한이 있습니다. 필자는 제약 스크립트와 두 테이블의 철자를 자세히 살펴 보았습니다.Oracle 11g : 교착 조건

제약 조건을 사용하려고하면 '부모 키를 찾을 수 없습니다.'라는 오류가 발생합니다. 물리적으로 데이터를 비교하고 필요한 값은 참으로 참조 된 테이블에 있습니다.

참조 된 열이 기본 키로 설정되어 있고 활성화되어 있습니다.

관련된 프로세스는 dblink를 통해 다른 스키마/데이터베이스에서 데이터로드/전송과 관련됩니다.

데이터 전송을위한 원본 테이블에는 실제로 사용할 수있는 비슷한 제약 조건이 있습니다.

데이터 감도로 인해 실제로 데이터를 게시 할 수 없으며 확인해야 할 추가 아이디어가 필요하다고 생각했습니다.

의견이나 제안 사항 제약 조건에 대한

코드 :

ALTER TABLE SR2.LOG ADD (
    CONSTRAINT FF1 
    FOREIGN KEY (NOTCH_ID) 
    REFERENCES SR2.NOTCH (ID) 
    DISABLE NOVALIDATE); 
+0

사용자가 당신이 FK를 상위 또는 하위 테이블의 데이터를 삽입을 확인 보관하지하면서? 프로덕션 데이터베이스에서이 작업이 수행되고 있습니까? –

+0

원본 테이블이 프로덕션이지만 참조 된 테이블에서 참조 된 값을 볼 수 있습니다. –

+0

아마 사용자 프로세스가 데이터를 삽입하는 순서가 그 원인 일 수 있습니다. 자식 테이블에 먼저 삽입하는 것. 그래도 아이디어. EXCEPTIONS 절을 사용해 보셨습니까? –

답변

5

그것을위한 오라클 내장 된 솔루션이있다. 당신은 ALTER TABLE의 예외 조항 사용할 수 있습니다

-- parent table 
    create table t1 (col1 number primary key); 

    insert into t1 values (1); 
    insert into t1 values (2); 
    insert into t1 values (3); 
    commit; 

    -- child table 
    create table t2 (col1 number); 

    insert into t2 values (1); 
    insert into t2 values (2); 
    insert into t2 values (3); 
    insert into t2 values (4); -- bad data 
    commit; 

    -- You create a table for the exceptions 
    create table excepts (row_id rowid, 
         owner varchar2(30), 
         table_name varchar2(30), 
         constraint varchar2(30)); 

    -- you still get error 
    alter table t2 add constraint f2 foreign key (col1) references t1 
    exceptions into excepts ; 

    -- but bad data will be here 
    -- please notice its 'ROW_ID' from the second table 
    select t2.* 
    from t2, 
     excepts 
    where t2.rowid = excepts.row_id; 
+0

ENABLE VALIDATE 문에서도 계속 사용할 수 있습니다. alter table t2 유효성 검사 유효성 검사 f2 exceptions into excepts; –

+0

펠리페 감사합니다. –

+0

+1 항상 새로운 것을 배울 수 있습니다. 'alter table' 중에 에러를 막을 수있는 방법이 있습니까? 비슷한 구문을 지원하는 RDBMS를 알고 있습니까? – Beryllium