Re: No me funciona Trigger de Auditoria

From: Raúl Andrés Duque <raulandresduque(at)hotmail(dot)com>
To: "WILLIAM PARRA" <wilparra(at)yahoo(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: No me funciona Trigger de Auditoria
Date: 2006-12-14 00:51:30
Message-ID: BAY135-DAV18C39083917D9AC3C0F525BAD50@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

William, la ejecutaste tal cual?

Ten en cuenta que es un ejemplo "genérico" y que en la línea:

IF NEW. || cols.nombre || <> OLD. || cols.nombre || THEN

debes reemplazarla por tus PROPIOS campos ... por ejemplo

IF NEW.nombre <> OLD.nombre THEN

Revisa y entiende la función para que la adaptes a tus propias necesidades.

Atentamente,

RAUL DUQUE
Bogotá, Colombia
----- Original Message -----
From: WILLIAM PARRA
To: pgsql-es-ayuda(at)postgresql(dot)org
Sent: Wednesday, December 13, 2006 7:27 PM
Subject: [pgsql-es-ayuda] No me funciona Trigger de Auditoria

Compañeros de lista:

No he logrado conseguir que funcione el siguiente trigger que tomé de la lista... Creo que lo Hizo Mario Soto.

CREATE OR REPLACE FUNCTION AUDITOR_TABLAS () RETURNS TRIGGER
AS '
DECLARE
CONSULTA varchar;
fecha timestamp;
tipo varchar;
cols record;
usuario varchar;
id integer;
pid integer;
columna varchar;
BEGIN
select into fecha current_timestamp(0);
-- INSERTA LA IP DEL EQUIPO DEL USUARIO
select into usuario inet_client_addr();
--select into usuario user;
select into pid pg_backend_pid();
IF TG_OP = ''INSERT'' THEN
tipo:=''I'';
select into id new.oid;
END IF;
IF TG_OP = ''UPDATE'' THEN
tipo:=''U'';
select into id old.oid;
END IF;

FOR cols IN
select attname as nombre,
attnum as numero
from pg_attribute
where attrelid = TG_RELID
and attnum > 0
and NOT attisdropped
LOOP
IF NEW. || cols.nombre || <> OLD. || cols.nombre || THEN
INSERT INTO auditoria (TIPO,FECHA,USUARIO,TABLA,CAMPO,NOMBRE1,NOMBRE2,NOMBRE3,PID)
values (tipo,fecha,usuario,TG_RELNAME,id,cols.nombre,cols.nombre,cols.nombre,pid);
END IF;
END LOOP;
RETURN NEW;
END;
'
LANGUAGE plpgsql;

Este es el script de la tabla de audoitoria

CREATE TABLE AUDITORIA
(
CODIGO_AUDITA serial NOT NULL,
TIPO CHAR(1),
FECHA TIMESTAMP,
USUARIO VARCHAR(20),
TABLA VARCHAR(30),
CAMPO VARCHAR(30),
PID VARCHAR(30)
)
/
Y el siguiente es el Trigger que cree sobre una tabla parentesco

CREATE TRIGGER AUDITOR_PARENTESCO
AFTER INSERT OR UPDATE OR DELETE ON PARENTESCO
FOR EACH ROW EXECUTE PROCEDURE AUDITOR_TABLAS();

Al tratar de efectuar un Insert en parentesco, este es el error que me saca...
Y realmente no sé de que se trate el error.

ERROR: record "old" is not assigned yet
Detail: The tuple structure of a not-yet-assigned record is indeterminate.
Line: 1 

Y este el error cuando trato de efectuar un Delete

record "new" is not assigned yet
Detail: The tuple structure of a not-yet-assigned record is indeterminate.
Line: 1 

Y este cuando trato de efectuar un Update

ERROR: syntax error at or near "||"
Line: 1

Gracias compañeros por sus aportes

Saludos,

Lo creo En Windows, y no saca error, pero cuando

William Enrique Parra Alba
Ingeniero De Sistemas
Universidad Pedagógica y Tecnológica de Colombia
/\ /\
/ //\\ \
\ \\// /
/ / \ \
\/ \/
__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gregorio Diaz 2006-12-14 00:56:47 Tablas temporales en RAM ?
Previous Message Raúl Andrés Duque 2006-12-14 00:42:19 Re: No funciona Dollar Quoting en Windows