2016-05-04 1:40 GMT+12:00 Euler Taveira <[email protected]>:
> On 03-05-2016 01:02, [email protected] wrote:
> > 1 - cada usuário na tabela users faz parte de uma empresa, essa empresa
> > é "determinada" pela coluna company_id na tabela users.
> >
> > 2 - Cada usuário, inclui os dados dentro de users.code, mas se ele não
> > incluir, a sequencia faz o trabalho.
> >
> > A questão, é que o valor default é de 1000, mas para cada empresa:
> >
> Você não resolve esse problema com sequências (a não ser que possa
> existir "buracos"). Para sequências que não podem ter buracos, é
> obrigatório o uso de uma tabela para controle da sequência. No seu caso,
> basta ter uma tabela de controle contendo campos (empresa, sequencia).
> Para fazer o INSERT, você deve codificar em alguma linguagem procedural
> ou mesmo na linguagem utilizada porque é necessário testar se 'code' foi
> informado ou não.
>
>
1 - Criando a funcao
CREATE OR REPLACE FUNCTION tf_users_update_code_column()
RETURNS trigger AS $$
BEGIN
IF NEW.company_id = 1 THEN
NEW.code = NEXTVAL('c1_users_code_seq');
ELSEIF NEW.company_id = 2 THEN
NEW.code = NEXTVAL('c2_users_code_seq');
ELSEIF NEW.company_id = 3 THEN
NEW.code = NEXTVAL('c3_users_code_seq');
ELSEIF NEW.company_id = 4 THEN
NEW.code = NEXTVAL('c4_users_code_seq');
ELSEIF NEW.company_id = 5 THEN
NEW.code = NEXTVAL('c5_users_code_seq');
ELSEIF NEW.company_id = 6 THEN
NEW.code = NEXTVAL('c6_users_code_seq');
ELSEIF NEW.company_id = 7 THEN
NEW.code = NEXTVAL('c7_users_code_seq');
ELSEIF NEW.company_id = 8 THEN
NEW.code = NEXTVAL('c8_users_code_seq');
ELSEIF NEW.company_id = 9 THEN
NEW.code = NEXTVAL('c9_users_code_seq');
ELSEIF NEW.company_id = 10 THEN
NEW.code = NEXTVAL('c10_users_code_seq');
END IF;
return NEW;
END
$$ LANGUAGE plpgsql;
2 - Criando as seq
CREATE SEQUENCE c1_users_code_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807 START 1000;
CACHE 1;
CREATE SEQUENCE c2_users_code_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807 START 1000;
CACHE 1;
CREATE SEQUENCE c3_users_code_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807 START 1000;
CACHE 1;
CREATE SEQUENCE c4_users_code_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807 START 1000;
CACHE 1;
... [etc] ...
3 - Criando o TRIGGER
CREATE TRIGGER t_users_update_code_column
BEFORE UPDATE OR INSERT
ON users
FOR EACH ROW
EXECUTE PROCEDURE tf_users_update_code_column();
Isso funciona bem. Sem nenhum problema.
O único problema é que eu teria milhares de seq para criar, pois haverá
milhares de clientes.
Isto é simplesmente inviável.
- Por favor, baseado no que forneci a cima, poderiam dar alguma luz sobre
como fazer o mesmo, mas mais "simples"? Talvez utilizar uma outra tabela
para armazenar os dados, como já mencionado.
Obrigado.
Lucas
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral