Pular para o conteúdo
  • Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 18 anos, 8 meses atrás por Marcio68Almeida.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #79101
    Wendel
    Participante

      Olá 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 localizadas

      Eu 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 NULL

      ALTER 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

      #79102
      chduarte
      Participante

        Sim. Vc vai utilizar o enable novalidate.

        No link http://download-east.oracle.com/docs/cd … tm#1002324 tem a documentacao completa.

        []

        #79103
        Wendel
        Participante

          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.

          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 NULL

          Obrigado

          WENDEL

          #79104
          Marcio68Almeida
          Participante

            Devo 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…

            #79105
            Marcio68Almeida
            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)

              #79106
              Wendel
              Participante

                Valeu 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

                #79112
                Marcio68Almeida
                Participante

                  Primeiramente é 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…

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.