- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 7 anos, 10 meses atrás por Tadeu Rodrigues de Oliveira.
-
AutorPosts
-
21 de novembro de 2016 às 9:31 pm #108512Tadeu Rodrigues de OliveiraParticipante
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.
22 de novembro de 2016 às 5:08 am #108513José Laurindo ChiappaModeradorOpa, 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
22 de novembro de 2016 às 10:08 pm #108514Tadeu Rodrigues de OliveiraParticipanteResolvido, Obrigado
-
AutorPosts
- Você deve fazer login para responder a este tópico.