Pessoal, estou usando a função abaixo para chamar de triggers no after
insert, update e delete das tabelas que desejo fazer logging. Ta funcionando
ok para todas as tabelas, exceto para uma, para a qual recebe a mensagem de
que não foi possível encontrar o campo "tgname". Segue tambem abaixo a
definição da tabela para a qual o trigger não funciona. Se alguém tiver uma
luz, da um toque ai.


CREATE OR REPLACE FUNCTION "public"."log_to_audit_table" () RETURNS trigger
AS
$body$
spi_exec "SELECT CURRENT_USER AS tguser"
spi_exec "SELECT relname AS tgname FROM pg_class WHERE relfilenode =
$TG_relid"
 
#skip changes on audit_table
if {[string equal -nocase $tgname audit_table]} { return OK }   //creio que
o erro seja aqui.
 
#get PK name
set pk_name ""
spi_exec "SELECT a.attname AS pk_name FROM pg_class c, pg_attribute a,
pg_index i
 WHERE c.relname = '$tgname'
 AND c.oid=i.indrelid
 AND a.attnum > 0
 AND a.attrelid = i.indexrelid
 AND i.indisprimary='t'"
 
switch $TG_op {
INSERT {
  set pk_value ""
 
  #get PK value
  foreach field $TG_relatts {
    if {[string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} {
      set pk_value [lindex [array get NEW $field] 1]
      break;
    }
  }
  #log inserted row values
  foreach field $TG_relatts {
    if {! [string equal -nocase [lindex [array get NEW $field] 0] $pk_name]}
{
      set modified_field [lindex [array get NEW $field] 0]
      set current_value [lindex [array get NEW $field] 1]
      spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, pk_name,
pk_value, mod_type, old_val, new_val)
        VALUES (CURRENT_TIMESTAMP, '$tguser', '$tgname', '$modified_field',
'$pk_name', '$pk_value', '$TG_op', NULL, '$current_value')"
    }
  }
}
UPDATE {
  set pk_value ""
 
  #get PK value
  foreach field $TG_relatts {
    if {[string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} {
      set pk_value [lindex [array get NEW $field] 1]
      break;
    }
  }
  #log inserted row values
  foreach field $TG_relatts {
    #check changed fields
    if {[string equal -nocase [array get NEW $field] [array get OLD $field]]
== 0} {
      set modified_field [lindex [array get OLD $field] 0]
      if {[string compare $modified_field ""] == 0} {
        set modified_field [lindex  [array get NEW $field] 0]
      }
      set previous_value [lindex [array get OLD $field] 1]
      set current_value  [lindex [array get NEW $field] 1]
      spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, pk_name,
pk_value, mod_type, old_val, new_val)
        VALUES (CURRENT_TIMESTAMP, '$tguser', '$tgname', '$modified_field',
'$pk_name', '$pk_value', '$TG_op', '$previous_value', '$current_value')"
    }
  }
}
DELETE {
  set pk_value ""
 
  #get PK value
  foreach field $TG_relatts {
    if {[string equal -nocase [lindex [array get OLD $field] 0] $pk_name]} {
      set pk_value [lindex [array get OLD $field] 1]
      break;
    }
  }
  #log inserted row values
  foreach field $TG_relatts {
    if {! [string equal -nocase [lindex [array get OLD $field] 0] $pk_name]}
{
      set modified_field [lindex [array get OLD $field] 0]
      set previous_value [lindex [array get OLD $field] 1]
      spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, pk_name,
pk_value, mod_type, old_val, new_val)
        VALUES (CURRENT_TIMESTAMP, '$tguser', '$tgname', '$modified_field',
'$pk_name', '$pk_value', '$TG_op', '$previous_value', NULL)"
    }
  }
}
}
return OK
$body$
LANGUAGE 'pltcl' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


CREATE TABLE "public"."lanctos_contab" (
  "id" BIGINT NOT NULL, 
  "id_conta_cred" INTEGER, 
  "id_conta_deb" INTEGER, 
  "id_empresa" INTEGER NOT NULL, 
  "id_terceiro" INTEGER, 
  "flag_origem" SMALLINT, 
  "chave_origem" BIGINT, 
  "origem" CHAR(2), 
  "valor" NUMERIC(18,2), 
  "data_lancto" DATE NOT NULL, 
  "historico" VARCHAR(200) NOT NULL, 
  "id_centro_custo" INTEGER, 
  "codigo_lancto" BIGINT, 
  "documento" VARCHAR(25), 
  CONSTRAINT "lanctos_contab_pkey" PRIMARY KEY("id"), 
  CONSTRAINT "lanctos_contab_fk1" FOREIGN KEY ("id_conta_cred")
    REFERENCES "public"."plano_contas"("id")
    ON DELETE RESTRICT
    ON UPDATE CASCADE
    NOT DEFERRABLE, 
  CONSTRAINT "lanctos_contab_fk2" FOREIGN KEY ("id_conta_deb")
    REFERENCES "public"."plano_contas"("id")
    ON DELETE RESTRICT
    ON UPDATE CASCADE
    NOT DEFERRABLE, 
  CONSTRAINT "lanctos_contab_fk3" FOREIGN KEY ("id_empresa")
    REFERENCES "public"."empresas"("id")
    ON DELETE RESTRICT
    ON UPDATE CASCADE
    NOT DEFERRABLE, 
  CONSTRAINT "lanctos_contab_fk4" FOREIGN KEY ("id_terceiro")
    REFERENCES "public"."terceiros"("id")
    ON DELETE RESTRICT
    ON UPDATE CASCADE
    NOT DEFERRABLE, 
  CONSTRAINT "lanctos_contab_fk5" FOREIGN KEY ("id_centro_custo")
    REFERENCES "public"."centros_custo"("id")
    ON DELETE RESTRICT
    ON UPDATE CASCADE
    NOT DEFERRABLE
) WITHOUT OIDS;

-- 
View this message in context: 
http://www.nabble.com/Para-quem-entende-de-C-tp25439471p25439471.html
Sent from the PostgreSQL - Brasil mailing list archive at Nabble.com.

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

Responder a