- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 18 anos, 8 meses atrás por
Marcio68Almeida.
-
AutorPosts
-
29 de março de 2007 às 3:06 pm #79101
Wendel
ParticipanteOlá estou com um problema sério, tenho uma base com todas as tabelas indices, sequences, sinonimos e views criadas.
Fiz a carga e deu alguns erros em algumas linhas e agora na hora de habilitar as Constraint (restrições de integridade), deu o seguinte erro:
CONSTRAINT REL_CD_FILHO4
*
ERRO na linha 2:
ORA-02298: não é possível validar (GRA.REL_CD_FILHO4) – chaves mães não localizadasEu fiz um teste no SQL PLUS criando uma tabela PAI e outra FILHO4. Dai inseri um filho na tabela FILHO4 com CD_PAI = 5, mas esse pai não existe na tabela PAI, dai ele não deixou criar.
Queria saber se tem jeito de forçar a criação de constraint?
Segue as tabelas que criei para teste:CREATE TABLE GRA.PAI
(
CD_PAI INTEGER NOT NULL,
NOME_PAI VARCHAR2(50 BYTE) NOT NULL,
END_PAI VARCHAR2(50 BYTE) NOT NULL
);CREATE TABLE GRA.FILHO4
(
CD_FILHO INTEGER NOT NULL,
NOME_FILHO VARCHAR2(50 BYTE) NOT NULL,
END_FILHO VARCHAR2(50 BYTE) NOT NULLALTER TABLE GRA.FILHO4 ADD (
CONSTRAINT REL_CD_FILHO
FOREIGN KEY (CD_PAI)
REFERENCES GRA.PAI (CD_PAI));———————–
alguem sabe como resolvo isso, forçando a criação de tabelas ou outra forma?Se eu tiver que apagar esses “FILHOS SEM PAI” que tipo de SELECT eu vou ter que fazer para resolver o problema? Por favor se alguem souber,
Obrigado
WENDEL
29 de março de 2007 às 3:24 pm #79102chduarte
ParticipanteSim. Vc vai utilizar o enable novalidate.
No link http://download-east.oracle.com/docs/cd … tm#1002324 tem a documentacao completa.
[]
29 de março de 2007 às 5:04 pm #79103Wendel
ParticipanteEstou um pouco com medo de executar as constraint com o comando acima (enable novalidate), pois depois com a base inconsistente pode dar um monte de erro na minha aplicação devido a essas incosistencias.
Tem algum comando para que eu possa descobrir quais os Filhos na tabela Filho estão sem PAI antes de criar as constraint? Ou é só via SELECT mesmo?
Caso seja só via select para descobrir os filhos sem pai, como eu faria um Select desse para as tabelas a seguir:
CREATE TABLE GRA.PAI
(
CD_PAI INTEGER NOT NULL,
NOME_PAI VARCHAR2(50 BYTE) NOT NULL,
END_PAI VARCHAR2(50 BYTE) NOT NULL
);CREATE TABLE GRA.FILHO4
(
CD_FILHO INTEGER NOT NULL,
NOME_FILHO VARCHAR2(50 BYTE) NOT NULL,
END_FILHO VARCHAR2(50 BYTE) NOT NULLObrigado
WENDEL
29 de março de 2007 às 5:14 pm #79104Marcio68Almeida
ParticipanteDevo te perguntar por que você quer uma ferramenta de contenção sem a sua função de contenção ???
Para que uma foreing key desabilitada se o objetivo dela é justamente evitar que entrem filhos sem pai ???
O que eu acho que você tgem que fazer é eliminar os filhos sem pai ou criar pais para os órfãos…29 de março de 2007 às 5:20 pm #79105Marcio68Almeida
Participante[quote=”Wendel”:19i0xjup]Estou um pouco com medo de executar as constraint com o comando acima (enable novalidate), pois depois com a base inconsistente pode dar um monte de erro na minha aplicação devido a essas incosistencias. [/quote]
Que bom que tem medo, o caminho não é esse mesmo… 😀
[quote=”Wendel”:19i0xjup]Tem algum comando para que eu possa descobrir quais os Filhos na tabela Filho estão sem PAI antes de criar as constraint? Ou é só via SELECT mesmo? [/quote]
Esse tipo de coisa é facilmente resolvido via select, não conheço nenhuma ferramenta que faça isso…
[quote=”Wendel”:19i0xjup]Caso seja só via select para descobrir os filhos sem pai, como eu faria um Select desse para as tabelas a seguir:[/quote]
Select * from filho where codigo_pai not in (select codigo_pai from pai)29 de março de 2007 às 6:10 pm #79106Wendel
ParticipanteValeu pela dica, vou fazer o seguinte:
- como as tabelas já estão com dados, e não são poucos (tabelas com 50 mil linhas) e preciso testar logo a aplicação. Detalhe a base é só para teste, portanto eu posso deletar que dado eu quiser. Eu vou fazer o select abaixo para descobrir quais filhos estão sem pai e apagalos:
Select * from filho where codigo_pai not in (select codigo_pai from pai)
Será que funciona o comando a seguir
DELETE FROM FILHO WHERE CD_PAI = (Select * from filho where codigo_pai not in (select codigo_pai from pai)
Obs; estou num ambiente onde eu não posso acessar o SQL PLUS para testar, eu só posso executar script e ver o erro que dá, é um ambiente UNIX onde o script executa atraves do SQLPLUS, mas antes ele le um arquivo de senha criptografado onde o UNIX descriptografa e executa. Por isso estou pergutando se funciona porque não posso testar.
WENDEL
29 de março de 2007 às 8:07 pm #79112Marcio68Almeida
ParticipantePrimeiramente é inviável você dar manutenção em uma aplicação sem poder executar scripts para testar a resposta…
O comando certo seria :
Delete from filho where codigo_pai in (Select codigo_pai from filho where codigo_pai not in (select codigo_pai from pai) )
atenção para o IN e NOT IN, não tem igual… -
AutorPosts
- Você deve fazer login para responder a este tópico.