Pular para o conteúdo
  • Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 7 anos, 10 meses atrás por Avatar de Tadeu Rodrigues de OliveiraTadeu Rodrigues de Oliveira.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #108512
    Avatar de Tadeu Rodrigues de OliveiraTadeu Rodrigues de Oliveira
    Participante

      Tenho uma CONSTRAINT no meu banco dando o seguinte erro ORA-02290: restrição de verificação

      O metadata desta CONSTRAINT está definido da seguinte maneira:

      alter table MGADM.EST_ITENSPEDCOMPRA
      add constraint ADM_CK_ITP_MUNICIPIOUF
      check (NOT (((UF_LOC_ST_SIGLA IS NOT NULL) AND (MUN_LOC_IN_CODIGO IS NULL)) OR ((UF_LOC_ST_SIGLA IS NULL) AND (MUN_LOC_IN_CODIGO IS NOT NULL))));

      Na tentativa de resolver o problema fiz a seguinte mudança:

      alter table MGADM.EST_ITENSPEDCOMPRA
      add constraint ADM_CK_ITP_MUNICIPIOUF
      check ((UF_LOC_ST_SIGLA IS NOT NULL) AND (MUN_LOC_IN_CODIGO IS NOT NULL));

      Mas o ORACLE exibiu a seguinte mensagem de erro: ORA-02293: Não é possível validar MGADM.EST_ITENSPEDCOMPRA – restrição de validação violada.

      Então voltei a situação anterior.

      Será que algum dos colegas pode me dar uma ajuda?

      Preciso entender o que estou fazendo de errado na modificação feita por mim os campos e a tabela existem e contem dados.

      Abraço a todos.

      Tadeu.

      #108513
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Opa, blz ? Antes de responder, uma Obs : creio que vc sabe que não tem como vc Modificar uma constraint, vc tem que a dropar e a recriar – se vc fazer ADD sem dropar a versão anterior da constraint, vai dar erro – vou Supor que vc não mostra mas está fazendo o DROP CONSTRAINT adequado…

        Muito bem, seguinte : a primeira coisa pra gente poder te ajudar é vc nos dizer em português claro qual é a regra de dados que vc quer implementar nessa constraint – SE A REGRA FOR que ambas as colunas (ie, a UF_LOC_ST_SIGLA e a MUN_LOC_IN_CODIGO) SEMPRE tem que ser preenchidas, nunca podendo ficar nulas independente de qquer outra condição, aí a sua sintaxe :

        alter table MGADM.EST_ITENSPEDCOMPRA
        add constraint ADM_CK_ITP_MUNICIPIOUF
        check ((UF_LOC_ST_SIGLA IS NOT NULL) AND (MUN_LOC_IN_CODIGO IS NOT NULL));

        estaria perfeitinha…

        ==> Porém, CASO Não SEJA ESSA a regra, e na verdade é uma regra mais complexa (por exemplo, é um OU lógico : ** OU ** a coluna UF_LOC_ST_SIGLA está Preenchida e a outra tá vazia ** OU ** MUN_LOC_IN_CODIGO tá preenchida e a outra tá nula), aí vc tem que codificar corretamente, sempre tendo em conta que só quando todas as condições forem verdadeiras é que o CHECK é aceito….
        Por exemplo, supondo essa regra de OU uma OU a outra coluna tem que estarem preenchidas mas nunca as duas preenchidas ao mesmo tempo e nunca ambas vazias) seria algo do tipo :

        alter table MGADM.EST_ITENSPEDCOMPRA
        add constraint ADM_CK_ITP_MUNICIPIOUF
        check (
        ( NOT (UF_LOC_ST_SIGLA IS NULL) AND (MUN_LOC_IN_CODIGO IS NULL) )
        AND ( (UF_LOC_ST_SIGLA IS NOT NULL AND MUN_LOC_IN_CODIGO IS NULL)
        OR (UF_LOC_ST_SIGLA IS NULL AND MUN_LOC_IN_CODIGO IS NOT NULL)
        )
        );

        ok ?

        UMA VEZ vc tendo codificado 100% corretamente a lógica necessária, se vc receber ainda assim uma msg “ORA-02293” , Claramente isso Indicaria que é uma questão de dados, vc TEM registros que violam a constraint… OK ? Não tem choro nem vela, se vc está com a lógica correta e recebe essa msg, a tabela está preenchida *** MAS ** teus dados estão SIM inválidos, tem registro(s) (e vc não sabe quantos, basta UM!!) inválido(s), preenchido incorretamente, vc tem que o localizar e corrigir ou deletar…

        Pra saber qual/quais registros estão violando a constraint vc faria um :

        SELECT * FROM MGADM.EST_ITENSPEDCOMPRA WHERE not (condição da check constraint);

        []s

        Chiappa

        #108514
        Avatar de Tadeu Rodrigues de OliveiraTadeu Rodrigues de Oliveira
        Participante

          Resolvido, Obrigado

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