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

Responder a