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

Responder a