Marllos,

Não resisti, montei a função em plpython:

CREATE EXTENSION plpythonu;

CREATE OR REPLACE FUNCTION trigger_bala() RETURNS trigger LANGUAGE
plpythonu AS $$
  import random
  rv = plpy.execute("SELECT attname FROM pg_attribute JOIN pg_constraint ON
pg_constraint.conrelid = pg_attribute.attrelid WHERE conkey = ARRAY[attnum]
AND contype = 'p' AND pg_attribute.attrelid = '%s'::regclass" %
TD["table_name"], 1)
  TD["new"][rv[0]["attname"]] = random.random()
  return "MODIFY"
$$;

CREATE TABLE teste (

 a float primary key
);

CREATE TRIGGER teste_bala BEFORE INSERT ON teste FOR EACH ROW EXECUTE
PROCEDURE trigger_bala();

INSERT INTO teste (a) VALUES (DEFAULT) RETURNING *;
       a
----------------
 0.345787825955
(1 row)

Em 10 de novembro de 2011 17:43, Marllos <[email protected]>escreveu:

> Deixa eu explicar melhor, tenho um sistema asp+firebird, que estou
> convertendo para php + firebird.
> Com o objetos pdo do php, o mesmo codigo pode acessar uma base equivalente
> em qualquer outro banco de dados (que o pdo dá suporte e são muitos bancos,
> incluindo o postgresql).
>
> Então estou tentando reproduzir fielmente a minha base de dados do
> firebird para o postgresql e isso é mais um exercicio de aprendizado com o
> postgresql. Já a conversão de asp+firebird para php não é aprendizado, é
> trabalho mesmo.
>
>
> Em 10 de novembro de 2011 16:57, Danilo Silva 
> <[email protected]>escreveu:
>
>> Por curiosidade, vc quer gerar um valor aleatório ( ou outro valor
>> qualquer) para cada pk das tabelas? Se for isso, não seria mais fácil
>> utilizar uma sequence e atribuir esta sequence como valor default das pks?
>>
>> Danilo
>>
>> Em 10 de novembro de 2011 16:29, Juliano Benvenuto Piovezan <
>> [email protected]> escreveu:
>>
>> 2011/11/10 Marllos <[email protected]>
>>> >
>>> > Foi mal amigo....
>>> > Na verdade eu quero é atribuir um valor a chave primária, mas fazendo
>>> refencia dinamica a chave.
>>> >
>>>
>>> Uma coisa que posso ter passado na discussão, mas sua chave é simples
>>> ou composta?
>>>
>>> Em plpgsql você realmente não conseguirá isso, a não ser que você
>>> utilize o mesmo nome do campo em todas as tabelas. Como os nomes são
>>> diferentes, como você especificou, apenas com alguma outra pl mesmo,
>>> como pltcl. Segue exemplo:
>>>
>>> CREATE OR REPLACE FUNCTION "fun_trg" (
>>> )
>>> RETURNS trigger AS
>>> $body$
>>> spi_exec -count 1 "SELECT a.attname as col
>>>                    FROM pg_class c,
>>>                         pg_attribute a,
>>>                         pg_index i
>>>                    WHERE c.oid = i.indrelid AND
>>>                          a.attrelid = i.indexrelid AND
>>>                          not a.attisdropped AND
>>>                          a.attnum > 0 AND
>>>                          i.indisprimary AND
>>>                          c.oid = '$TG_relid'"
>>> spi_exec -count 1 "SELECT uuid_generate_v4() as c"
>>> set NEW($col) $c
>>> return [array get NEW]
>>> $body$
>>> LANGUAGE 'pltcl'
>>> VOLATILE
>>> CALLED ON NULL INPUT
>>> SECURITY INVOKER
>>> COST 100;
>>>
>>> _______________________________________________
>>> pgbr-geral mailing list
>>> [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
>>
>>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>


-- 
Daniel Cristian Cruz
クルズ クリスチアン ダニエル
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a