2010/1/4 Alexsander Rosa <[email protected]>
> Segue exemplo. O último comando gera uma inconsistência que eu gostaria de
> poder evitar via constraint. A inconsistência é a seguinte: somente
> produtos-base deveriam ter estoque; neste caso o usuário deve primeiro
> eliminar o endereço do estoque (movendo os pallets ou algo que o valha) para
> depois mudar as associações produto-embalagem. Hoje preciso controlar isso
> via aplicação mas gostaria de ter mais um nível de controle de consistência
> no banco.
>
>
Caro Alexsander,
Quem sabe a alternativa em anexo seja uma opção... note as modificações que
fiz (campo tipo na tabela produtos e tipo na tabela de estoques)...
Verifique e voltamos a discutir...
Cordialmente,
--
Fabrízio de Royes Mello
>> Blog sobre TI: http://fabriziomello.blogspot.com
DROP TABLE IF EXISTS tmp_estoque;
DROP TABLE IF EXISTS tmp_produto;
CREATE TABLE tmp_produto (
cod_prod integer primary key,
descricao text,
prod_base integer,
caixa_com integer,
tipo integer default 1, -- 1 = Base 2 = Outro (mas prod_base tem que ser = null)
CHECK ( (prod_base IS NULL AND tipo = 1) OR (tipo <> 1) ),
FOREIGN KEY (prod_base) REFERENCES tmp_produto(cod_prod)
);
CREATE UNIQUE INDEX idx_tmp_tipo ON tmp_produto(cod_prod,tipo);
CREATE TABLE tmp_estoque (
posicao_pallet varchar(10) primary key,
cod_prod_fk integer not null,
tipo_prod_fk integer default 1,
quantidade integer,
CHECK (tipo_prod_fk = 1), -- Somente Produto Base
FOREIGN KEY (cod_prod_fk) REFERENCES tmp_produto(cod_prod),
FOREIGN KEY (cod_prod_fk, tipo_prod_fk) REFERENCES tmp_produto(cod_prod, tipo) MATCH FULL
);
-- cria um produto e seu estoque
INSERT INTO tmp_produto (cod_prod, descricao, prod_base, caixa_com) VALUES (314, 'BLISTER COM DUAS PILHAS', null, null);
INSERT INTO tmp_estoque (posicao_pallet, cod_prod_fk, quantidade) VALUES ('ABC-1234', 314, 10);
-- cria um novo produto-base
INSERT INTO tmp_produto (cod_prod, descricao, prod_base, caixa_com) VALUES(315,'BLISTER COM UMA PILHA',null,null);
-- Aqui tenta alterar o Produto Base sem Alterar o Tipo (Viola Check Constraint da Tabela tmp_produto)
UPDATE tmp_produto SET prod_base = 315, caixa_com = 2 WHERE cod_prod = 314;
-- Aqui tenta alterar o Produto Base Alterando o Tipo (Viola Foreign Key Constraint da Tabela tmp_estoque)
UPDATE tmp_produto SET prod_base = 315, caixa_com = 2, tipo = 2 WHERE cod_prod = 314;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral