[firebase-br] Nao esta respeitando Uniquei

André Conrado acf em andreconrado.net
Sex Jul 20 15:50:52 -03 2012


Quanto diz que alguns campos não são obrigatórios eu entendo que os
mesmos conterão valores nulos. Em minhas experiências com chaves
únicas compostas quando um campo é nulo todo o registro é
desconsiderado, não fazendo parte do índice e causando a duplicidade.
Você tem que popular todos os campos. Caso esses campos façam parte de
alguma FK, então utilize uma expressão para criação do índice, assim:

LPAD(COALESCE(CAMPO1, 0), 10, '0') || LPAD(COALESCE(CAMPO2, 0), 10,
'0') || LPAD(COALESCE(CAMPO1, 0), 10, '0')

pode ser isso ou algo do gênero, é só uma ideia.

Abs



Em 20 de julho de 2012 09:49, Cleber Moises Grings
<grings em grings.eti.br> escreveu:
> Hélio Oliveira <hpensador em ...> writes:
>
>>
>> Bom dia Cleber!
>>
>> Não entendi bem sua colocação quando diz... "outros todos são partes de uma
>> UK, os campos da UK são todos inteiros e não obrigatorios".
>>
>> Se os demais campos compoem uma UK (Unique Key) eles passam a ser
>> obrigatórios, ou eu estou errado?
>>
>> "Cleber Moises Grings"  escreveu na notícia da
>> mensagem:juadcq$vbs$1 <at> dough.gmane.org...
>>
>> Temos uma tabela a onde são gravados dados atraves de uma SP
>>
>> Esta tabela tem alguns poucos campos, um deles é a chave primaria e os
>> outros todos são partes de uma UK, os campos da UK são todos inteiros e não
>> obrigatorios
>> em uma situação a onde são gravados atravez de uma SP ao preencher os os
>> dois primeiros campos da UK aceita fazer a operação uma segunda vez sem
>> mostrar erro algum, persistindo o dado no DB.
>>
>> Queria ver se alguem já passou por isto, e o que esta sendo feito de errado,
>> para permitir esta gravação?
>>
>> Grato
>>
>> Cléber Grings
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>
>
> Mais detalhes
> a estrutura da tabela esta baixo
>
> O que acontece que esta permitindo inserir registros duplicados
>
> informando apenas o ID diferente
> e ID_PROD_ESTQ e ID_ALMOX estes dois campos preenchidos os demais campos com
> null, aceita um segundo registro
>
>
> CREATE GENERATOR GEN_CONFIG_ESTOQUE;
>
> CREATE TABLE CONFIG_ESTOQUE (
>     ID            D_ID NOT NULL /* D_ID = INTEGER NOT NULL */,
>     ID_PROD_ESTQ  D_ID /* D_ID = INTEGER NOT NULL */,
>     ID_ALMOX      D_ID /* D_ID = INTEGER NOT NULL */,
>     ID_TAB_LOTE   D_ID_NO /* D_ID_NO = INTEGER */,
>     ID_SUBPROD    D_ID_NO /* D_ID_NO = INTEGER */,
>     ID_ENDEST     D_ID_NO /* D_ID_NO = INTEGER */,
>     ID_MASCARA    D_ID_NO /* D_ID_NO = INTEGER */,
>     ID_SERIE      D_ID_NO /* D_ID_NO = INTEGER */
> );
>
> ALTER TABLE CONFIG_ESTOQUE ADD CONSTRAINT UK_CONFIG_ESTOQUE_UNICO UNIQUE
> (ID_PROD_ESTQ, ID_ALMOX, ID_TAB_LOTE, ID_SERIE, ID_SUBPROD, ID_ENDEST,
> ID_MASCARA);
>
> ALTER TABLE CONFIG_ESTOQUE ADD CONSTRAINT PK_CONFIG_ESTOQUE PRIMARY KEY (ID);
>
> ALTER TABLE CONFIG_ESTOQUE ADD CONSTRAINT FK_CONFIG_ESTOQUE_ALMOX FOREIGN KEY
> (ID_ALMOX) REFERENCES ALMOXARIFADO (ID);
> ALTER TABLE CONFIG_ESTOQUE ADD CONSTRAINT FK_CONFIG_ESTOQUE_PROD_ESTQ FOREIGN
> KEY (ID_PROD_ESTQ) REFERENCES PRODUTO_ESTOQUE (ID);
> ALTER TABLE CONFIG_ESTOQUE ADD CONSTRAINT FK_CONFIG_ESTOQUE_SERIE FOREIGN KEY
> (ID_SERIE) REFERENCES TAB_SERIE (ID);
> ALTER TABLE CONFIG_ESTOQUE ADD CONSTRAINT FK_CONFIG_ESTOQUE_TAB_LOTE FOREIGN
> KEY (ID_TAB_LOTE) REFERENCES TAB_LOTE (ID);
>
>
> /* Trigger: TRG_CONFIG_ESTOQUE_BI0 */
> CREATE OR ALTER TRIGGER TRG_CONFIG_ESTOQUE_BI0 FOR CONFIG_ESTOQUE
> ACTIVE BEFORE INSERT POSITION 0
> AS
> begin
>    if ((new.ID is null) or (new.ID=0)) then
>       new.ID = Gen_Id(GEN_CONFIG_ESTOQUE,1);
> end
> ^
>
>
> /* Trigger: TRG_CONFIG_ESTOQUE_BIU0 */
> CREATE OR ALTER TRIGGER TRG_CONFIG_ESTOQUE_BIU0 FOR CONFIG_ESTOQUE
> ACTIVE BEFORE INSERT OR UPDATE POSITION 0
> as
> begin
>   execute procedure SP_UES_VAL_CONFIG_ESTOQUE(new.ID_PROD_ESTQ,
>                                               new.ID_TAB_LOTE,
>                                               new.ID_SERIE,
>                                               new.ID_SUBPROD);
> end
> ^
>
>
> SET TERM ; ^
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa




Mais detalhes sobre a lista de discussão lista