Em 09/11/2011 11:17, Marllos escreveu:
Obrigado JotaComm

No firebird, eu tenho que fazer uma trigger para cada tabela. No Postgresql eu percebi (se não estou enganado) que eu posso usar a mesma função de trigger em várias tabelas e é isso que estou tentando fazer.

a minha função de trigger seria

create or replace function *gerar_id()* returns trigger as $$
begin
  --essa trigger define a chave primária
--as tabelas que vão disparar essa trigger são tabela1, tabela2, tabela3, ... (muitas) --essas tabelas já existem e cada uma tem uma chave primária, do mesmo tipo, mas com nomes diferentes

new.(nome da chave primária da tabela que está disparando essa trigger) = uuid_generate_v4()

end
$$ language plpgsql;

Agora eu quero usar essa trigger em várias tabelas:

create tigger tabela1_tg before insert on tabela1
for each row execute *gerar_id()*;

create tigger tabela2_tg before insert on tabela2
for each row execute *gerar_id()*;

create tigger tabela3_tg before insert on tabela3
for each row execute *gerar_id()*;

Etc...

Em 9 de novembro de 2011 10:17, JotaComm <[email protected] <mailto:[email protected]>> escreveu:

    Olá, Marllos

    Em 9 de novembro de 2011 10:15, Daniel Cristian Cruz
    <[email protected] <mailto:[email protected]>>
    escreveu:

        Acredito que uma forma seja usando PL/Python:

        http://www.postgresql.org/docs/9.1/interactive/plpython-trigger.html

        Já procurei como fazer com PL/pgSQL, mas não encontrei como
        referenciar dinamicamente o nome do atributo de chave primária.

        Você precisará consultar o catálogo, através da pg_attribute
        (attname) e da pg_constraint (contype='p').

        Em 9 de novembro de 2011 10:02, Marllos
        <[email protected] <mailto:[email protected]>>
        escreveu:

            Por favor, preciso de ajuda para revolver um problema. E
            se for possível gostaria de um exemplo.

            Em uma trigger, eu quero alterar a chave primária da
            tabela que dispara essa trigger, mas de forma dinâmica,
            por exemplo:

            new.(referencia dinâmica a chave primária da tebela) = valor.


    Não entendi o que você deseja. Poderia colocar um exemplo prático
    da situação.


            Obrigado.

            Marllos.
            _______________________________________________
            pgbr-geral mailing list
            [email protected]
            <mailto:[email protected]>
            https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- Daniel Cristian Cruz
        ??? ?????? ????

        _______________________________________________
        pgbr-geral mailing list
        [email protected]
        <mailto:[email protected]>
        https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



    Abraços
-- JotaComm
    http://jotacomm.wordpress.com

    _______________________________________________
    pgbr-geral mailing list
    [email protected]
    <mailto:[email protected]>
    https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



__________ Information from ESET NOD32 Antivirus, version of virus signature 
database 6615 (20111109) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com

eu fiz isso de outra maneira, veja se é isso que precisa, isso é um exemplo que fiz para um colega que usava Firebird.

--postgresql.conf
--custom_variable_classes = 'sistema' # list of custom variable class names
--sistema.fkempresa = 0
--sistema.fkfilial = 0
--SELECT SET_CONFIG('sistema.fkempresa', '1', FALSE); -- FALSE para sessão atual, TRUE para transação atual
--SELECT SET_CONFIG('sistema.fkfilial', '2', FALSE);

CREATE OR REPLACE FUNCTION codigonovo(pnometabela VARCHAR,ptipo VARCHAR)
RETURNS VARCHAR AS
$$
DECLARE
    nFkempresa INTEGER;
    nFkfilial  INTEGER;
   rRetorno   RECORD;
BEGIN
    SELECT INTO nFkempresa CURRENT_SETTING('sistema.fkempresa');
    SELECT INTO nFkfilial CURRENT_SETTING('sistema.fkfilial');
    IF COALESCE(nFkempresa,0) = 0 THEN
        RAISE EXCEPTION 'Empresa não setada para a sessão corrente!';
    END IF;
    IF COALESCE(nFkfilial,0) = 0 THEN
        RAISE EXCEPTION 'Filial não setada para a sessão corrente!';
    END IF;
    IF LOWER(pTipo) = 'empresa' THEN
        RETURN nFkempresa;
    END IF;
    IF LOWER(pTipo) = 'filial' THEN
        RETURN nFkfilial;
    END IF;
FOR rRetorno IN EXECUTE 'SELECT COALESCE(MAX(sequencia),0) + 1 AS sequencia
                            FROM '||pnometabela||'
                            WHERE fkempresa = '||nFkempresa||'
                            AND fkfilial = '||nFkfilial
   LOOP
       IF LOWER(pTipo) = 'sequencia' THEN
           RETURN rRetorno.sequencia;
       ELSE
           RETURN nFkempresa||'.'||nFkfilial||'.'||rRetorno.sequencia;
       END IF;
   END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE TABLE cadastro
(
fkempresa integer DEFAULT codigonovo('cadastro'::character varying,'empresa'::character varying)::INTEGER, fkfilial integer DEFAULT codigonovo('cadastro'::character varying,'filial'::character varying)::INTEGER, sequencia integer DEFAULT codigonovo('cadastro'::character varying,'sequencia'::character varying)::INTEGER, codigo character varying DEFAULT codigonovo('cadastro'::character varying,'codigo'::character varying),
  descricao character varying(100)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE cadastro OWNER TO postgres;

SELECT SET_CONFIG('sistema.fkempresa', '1', FALSE); -- FALSE para sessão atual, TRUE para transação atual
SELECT SET_CONFIG('sistema.fkfilial', '2', FALSE);
INSERT INTO cadastro (descricao) VALUES ('teste');
SELECT * FROM cadastro ORDER BY sequencia DESC;

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a