>  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

Responder a