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