> Na verdade este fonte e dinamico "SQL02 = 'SELECT new.'|| campo || '
> INTO' valornovo'" para que todas as tabelas utilizem esta função.;
Isso que está tentando fazer não rola pl/pgsql ... pl/perl ou outra
linguagem com mais recursos ...
Já fiz em plperl... Segue:
<code>
CREATE OR REPLACE FUNCTION tzrepl.tzr_log_command() RETURNS trigger AS $$
#-- Tipo de Evento (INSERT / UPDATE / DELETE)
my $tg_ev = $_TD->{event};
#-- OID da tabela que recebeu o comando
my $table_OID = $_TD->{relid};
#-- Nome da tabela que recebeu o comando
my $table_name_value = $_TD->{relname};
#-- Chave Primaria da Tabela
#-- TODO - Chave composta
$rs_pk = spi_exec_query("SELECT
tzrepl.tzr_get_pk_field_by_oid($table_OID) AS pk");
if($rs_pk{status} == SPI_OK_SELECT)
{
$pk_column = $rs_pk->{rows}[0]->{pk};
$pk_value = defined $_TD->{"new"}{$pk_column} ?
$_TD->{"new"}{$pk_column} : $_TD->{"old"}{$pk_column};
}
#-- Verifica se não é um registro recebido via replicação
$rs_rcv = spi_exec_query("SELECT tzrepl.tzr_check_received_log() AS
rcv");
if($rs_rcv{status} == SPI_OK_SELECT)
{
$rcv = $rs_rcv->{rows}[0]->{rcv};
}
else
{
$rcv = 'f';
}
$rs_schema = spi_exec_query("SELECT
tzrepl.tzr_get_schema_name_by_table_oid($table_OID) AS schema");
$schema_name = $rs_schema->{rows}[0]->{schema};
#-- Insere o Log
$rs_log = spi_exec_query("INSERT INTO tzrepl.tzr_log
(schema_name,table_name,op_type,pk_value,pk_field,received) VALUES
('$schema_name','$table_name_value','$tg_ev','$pk_value','$pk_column','$rcv')");
if($rs_log{status} == SPI_OK_INSERT)
{
#-- Obtem o ID do log inserido
$rs_log_value = spi_exec_query("SELECT
currval('tzrepl.tzr_log_id_log_seq') as id_log");
if($rs_log_value{status} == SPI_OK_SELECT)
{
#-- Restaurando o ID do log inserido
$id_log = $rs_log_value->{rows}[0]->{id_log};
my %newrow = %{$_TD->{new}};
while (($column,$value) = each %newrow)
{
$exec = 0;
if($tg_ev eq 'INSERT')
{
$exec = 1;
$old_val = "";
$new_val = $_TD->{new}{$column};
}
elsif($tg_ev eq 'DELETE')
{
$exec = 1;
$old_val = $_TD->{old}{$column};
$new_val = "";
}
elsif($tg_ev eq 'UPDATE')
{
$old_val = $_TD->{old}{$column};
$new_val = $_TD->{new}{$column};
if($_TD->{new}{$column} eq
$_TD->{old}{$column})
{
$exec = 0;
}
else
{
$exec = 1;
}
}
$old_val =~ s/\'/\'\'/g;
$new_val =~ s/\'/\'\'/g;
$old_val =~ s/\\/\\\\/g;
$new_val =~ s/\\/\\\\/g;
$old_val = (!defined $old_val) ? "NULL" :
"'$old_val'::text";
$new_val = (!defined $new_val) ? "NULL" :
"'$new_val'::text";
if($exec == 1)
{
$query_log_det = "INSERT INTO
tzrepl.tzr_log_detail
(id_log,column_name,new_value,old_value) VALUES
('$id_log','$column',$new_val,$old_val)";
$rs_log_det =
spi_exec_query($query_log_det);
if($rs_log_det{status} != SPI_OK_INSERT)
{
elog(NOTICE,$query_log_det);
}
}
}
}
}
return;
END;
$$ LANGUAGE "plperl";
</code>
--
Att:
Thiago Risso
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral