Tenho a seguinte tabela em meu banco de dados Oracle (19c):
CREATE TABLE debtors (
bankruptID NUMBER NOT NULL,
category VARCHAR2(50) NOT NULL,
lastname VARCHAR2(100),
firstname VARCHAR2(80),
birthdate DATE,
birthplace VARCHAR2(100),
constraint DEBTORS_PK PRIMARY KEY (bankruptID));
ALTER TABLE debtors ADD CONSTRAINT debtors_fk0 FOREIGN KEY (category) REFERENCES categories(BankruptCategory);
Possui uma chave primária e uma chave estrangeira para outra tabela. Para esta tabela (devedores), desejo importar dados de um arquivo csv usando sqlldr. Aqui estão os arquivos ctl e *par *:
OPTIONS (SKIP=1)
LOAD DATA
CHARACTERSET CL8MSWIN1251
INTO TABLE myschema.debtors
REENABLE DISABLED_CONSTRAINTS EXCEPTIONS EXCEPT_TABLE
FIELDS TERMINATED BY '^'
TRAILING NULLCOLS
(
bankruptID,
category,
lastname,
firstname,
birthdate date 'YYYY-MM-DD HH24:MI:SS',
birthplace
)
userid=username/password@mydb
control=debtors.ctl
log=debtors.log
bad=debtors.bad
data=debtors.csv
direct=true
Depois de concluir a tarefa, o arquivo de log informa o seguinte:
Restrição de integridade referencial/informações de gatilho: as restrições NULL, UNIQUE e PRIMARY KEY não são afetadas.
A restrição mychema.DEBTORS.DEBTORS_FK0 foi desativada e atualizada antes do carregamento. O(s) seguinte(s) índice(s) na tabela mychema.DEBTORS foram processados: index mychema.DEBTORS_PK carregado com sucesso com 896 chaves
A tabela mychema.DEBTORS não possui tabela de exceção de restrição. Nenhuma restrição CHECK, REFERENTIAL foi reativada após o carregamento.
E a chave estrangeira (debtors_fk0) fica desativada. Como você pode ver no arquivo *ctl *, tenho a cláusula REENABLE, mas parece não estar funcionando. Você poderia me ajudar a entender qual é o problema? Eu quero que ele reative a restrição automaticamente
Criei uma tabela EXCEPT_TABLE para armazenar todas as exceções, mas não adiantou
Tudo é como esperado. Se você verificar o status da restrição, verá que está ATIVADO, mas NÃO VALIDADO - não pode ser se houver linhas que violam a restrição de chave estrangeira.
Exemplo 1 : o que acontece quando tudo está bem?
Tabelas de amostra:
Duas categorias (22, 33) - AMBAS serão usadas durante o carregamento de dados, o que significa que a restrição de chave estrangeira não será violada:
Arquivo de controle:
Carregando sessão: com caminho direto, o Oracle desabilita automaticamente as restrições conforme descrito na documentação.
Arquivo de log diz:
Resultado:
Exemplo #2 : chave pai da restrição de chave estrangeira ausente.
Tabelas de amostra:
Categoria agora está faltando ID_CAT = 33:
O arquivo de controle não foi modificado - os dados de amostra ainda contêm ID_CAT = 33 linhas.
Nada mudou na maneira como o sqlldr está sendo chamado; ambas as linhas (mesmo a inválida!) são carregadas:
Log diz isso (leia com atenção !):
Resultado: ambas as linhas na
test
tabela (destino).except_Table
agora contém a linha que violou a restrição de chave estrangeira. O status da restrição é HABILITADO NÃO VALIDADO .Se você tentar validar manualmente a restrição de chave estrangeira, não poderá fazer isso:
Primeiro remova a(s) linha(s) que violaram a restrição e, em seguida, valide-a:
Portanto, sim - está tudo bem e funciona conforme o esperado.