Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?

2010-01-06 Por tôpico Alexsander Rosa
Fabrizio, testei neste exemplo e parece ter funcionado.
Vou implementar no BD de desenvolvimento e aviso.
Abraços
Alex

2010/1/5 Fabrízio de Royes Mello fabriziome...@gmail.com



 2010/1/4 Alexsander Rosa alexsander.r...@gmail.com

 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




-- 
Atenciosamente,
Alexsander da Rosa
Linux User #113925

Extremismo na defesa da liberdade não é defeito.
Moderação na busca por justiça não é virtude.
-- Barry Goldwater
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?

2010-01-05 Por tôpico Fabrízio de Royes Mello
2010/1/4 Alexsander Rosa alexsander.r...@gmail.com

 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?

2010-01-04 Por tôpico Alexsander Rosa
Tenho duas tabelas, produto e estoque. Em produto a PK é código; há
também um par de campos (cod_base, quantidade) onde cod_base é uma FK
auto-referenciada. Este par serve para as embalagens: o produto 1234 pode
ser uma embalagem com 12 unidades do produto 1231 por exemplo. As unidades
(UN, CX, PCT, etc) são tratadas de acordo.

Na tabela estoque há um campo código_fk que é FK de produto. Somente
produtos-base (isto é, com NULL em cod_base) podem ter registros em
estoque. No entanto, às vezes um produto deixa de ser base e passa a ser
embalagem*, deixando registros sobrando na tabela estoque; tenho que
controlar isso via aplicação mas gostaria de usar o SGBD para garantir esta
integridade de forma mais efetiva.

Segundo sugestão do IRC, tentei criar uma coluna extra em estoque, deixada
sempre em NULL, criando uma nova FK em estoque usando os dois campos de
produto (cod_produto e cod_base). Consegui criar esta constraint mas ela
não funcionou: valores inválidos ainda puderam ser inseridos.

* Exemplo: um blister com 4 pilhas é vendido como base e vem numa
embalagem com 50 blisters. Um dia o fabricante resolve fazer blisters com 2
pilhas -- ou o lojista resolve abrir os blisters e vender as pilhas
individualmente.

-- 
Atenciosamente,
Alexsander da Rosa
Linux User #113925

Extremismo na defesa da liberdade não é defeito.
Moderação na busca por justiça não é virtude.
-- Barry Goldwater
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?

2010-01-04 Por tôpico JotaComm
Olá,

2010/1/4 Alexsander Rosa alexsander.r...@gmail.com

 Tenho duas tabelas, produto e estoque. Em produto a PK é código; há
 também um par de campos (cod_base, quantidade) onde cod_base é uma FK
 auto-referenciada. Este par serve para as embalagens: o produto 1234 pode
 ser uma embalagem com 12 unidades do produto 1231 por exemplo. As unidades
 (UN, CX, PCT, etc) são tratadas de acordo.

 Na tabela estoque há um campo código_fk que é FK de produto. Somente
 produtos-base (isto é, com NULL em cod_base) podem ter registros em
 estoque. No entanto, às vezes um produto deixa de ser base e passa a ser
 embalagem*, deixando registros sobrando na tabela estoque; tenho que
 controlar isso via aplicação mas gostaria de usar o SGBD para garantir esta
 integridade de forma mais efetiva.

 Segundo sugestão do IRC, tentei criar uma coluna extra em estoque,
 deixada sempre em NULL, criando uma nova FK em estoque usando os dois
 campos de produto (cod_produto e cod_base). Consegui criar esta constraint
 mas ela não funcionou: valores inválidos ainda puderam ser inseridos.

 * Exemplo: um blister com 4 pilhas é vendido como base e vem numa
 embalagem com 50 blisters. Um dia o fabricante resolve fazer blisters com 2
 pilhas -- ou o lojista resolve abrir os blisters e vender as pilhas
 individualmente.


Não entendi. Teria como colocar um exemplo mais claro, por exemplo com o
valor que segundo você comentou que foi inserido e não poderia ter
acontecido.


 --
 Atenciosamente,
 Alexsander da Rosa
 Linux User #113925

 Extremismo na defesa da liberdade não é defeito.
 Moderação na busca por justiça não é virtude.
 -- Barry Goldwater

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



[]s
-- 
JotaComm
http://jotacomm.wordpress.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como criar uma FK checando um campo qualquer na tabela referenciada?

2010-01-04 Por tôpico Alexsander Rosa
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.

2010/1/4 JotaComm jota.c...@gmail.com

 Olá,

 2010/1/4 Alexsander Rosa alexsander.r...@gmail.com

 Tenho duas tabelas, produto e estoque. Em produto a PK é código; há
 também um par de campos (cod_base, quantidade) onde cod_base é uma FK
 auto-referenciada. Este par serve para as embalagens: o produto 1234 pode
 ser uma embalagem com 12 unidades do produto 1231 por exemplo. As unidades
 (UN, CX, PCT, etc) são tratadas de acordo.

 Na tabela estoque há um campo código_fk que é FK de produto. Somente
 produtos-base (isto é, com NULL em cod_base) podem ter registros em
 estoque. No entanto, às vezes um produto deixa de ser base e passa a ser
 embalagem*, deixando registros sobrando na tabela estoque; tenho que
 controlar isso via aplicação mas gostaria de usar o SGBD para garantir esta
 integridade de forma mais efetiva.

 Segundo sugestão do IRC, tentei criar uma coluna extra em estoque,
 deixada sempre em NULL, criando uma nova FK em estoque usando os dois
 campos de produto (cod_produto e cod_base). Consegui criar esta constraint
 mas ela não funcionou: valores inválidos ainda puderam ser inseridos.

 * Exemplo: um blister com 4 pilhas é vendido como base e vem numa
 embalagem com 50 blisters. Um dia o fabricante resolve fazer blisters com 2
 pilhas -- ou o lojista resolve abrir os blisters e vender as pilhas
 individualmente.


 Não entendi. Teria como colocar um exemplo mais claro, por exemplo com o
 valor que segundo você comentou que foi inserido e não poderia ter
 acontecido.




-- 
Atenciosamente,
Alexsander da Rosa
Linux User #113925

Extremismo na defesa da liberdade não é defeito.
Moderação na busca por justiça não é virtude.
-- Barry Goldwater
CREATE TABLE tmp_produto (
  cod_prod integer primary key,
  descricao text,
  prod_base integer,
  caixa_com integer,
  FOREIGN KEY (prod_base) REFERENCES tmp_produto(cod_prod)
  );

CREATE UNIQUE INDEX idx_tmp_prodbase ON tmp_produto(cod_prod,prod_base);

CREATE TABLE tmp_estoque (
  posicao_pallet varchar(10) primary key,
  cod_prod_fk integer not null,
  campo_nulo integer,
  quantidade integer,
  FOREIGN KEY (cod_prod_fk) REFERENCES tmp_produto(cod_prod),
  FOREIGN KEY (cod_prod_fk,campo_nulo) REFERENCES tmp_produto(cod_prod,prod_base)
  );

-- cria um produto e seu estoque
INSERT INTO tmp_produto VALUES(314,'BLISTER COM DUAS PILHAS',null,null);
INSERT INTO tmp_estoque VALUES('ABC-1234',314,null,10);

-- cria um novo produto-base
INSERT INTO tmp_produto VALUES(315,'BLISTER COM UMA PILHA',null,null);
UPDATE tmp_produto SET prod_base = 315, caixa_com = 2 WHERE cod_prod = 314;



___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral