From: | Miguel Torres <mtorres066(at)gmail(dot)com> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | error en ejecucion de trigger |
Date: | 2011-04-18 21:19:21 |
Message-ID: | BANLkTiki8hEJpt_r1p1Zsr=tWmWNeisiJA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Hola amigos de la lista,
Tengo un problema con la ejecucion de un Trigger, explico: Busco con un
trigger registrar todos los movimientos de ciertas tablas (auditoria de
movimientos)
Tengo la sig. funcion que es llamada por el trigger:
CREATE OR REPLACE FUNCTION procesa_usuario_audit() RETURNS trigger AS
$$
DECLARE
BEGIN
-- Crea un registro en usuario_audit para reflejar las operaciones
-- realizadas en usuario utiliza las variables especiales TG_OP
-- para efectuar la operacion
IF (TG_OP = 'DELETE') THEN
INSERT INTO usuario_audit SELECT
nextval('usuario_audit_id_usuario_audit_seq'::regclass), 'D', now(), user,
OLD.id_usuario;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO usuario_audit SELECT
nextval('usuario_audit_id_usuario_audit_seq'::regclass), 'U', now(), user,
NEW.id_usuario;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO usuario_audit SELECT
nextval('usuario_audit_id_usuario_audit_seq'::regclass), 'I', now(), user,
NEW.id_usuario;
RETURN NEW;
END IF;
RETURN NULL; -- el resultado es ignorado puesto que este es un trigger
AFTER
END;
$$
LANGUAGE plpgsql;
Esta es la tabla original principal a donde amarro el trigger: tabla usuario
Columna | Tipo |
Modificadores
-----------------+--------------------------------+---------------------------------------------------------------
id | integer | not null valor por
omisin nextval('usuario_id_seq'::regclass)
id_usuario | integer | not null
nombre | character varying |
apellido | character varying |
puesto | character varying |
depto | character varying |
num_serv_sol | integer |
ultimo_ticket | integer |
usuario_windows | character varying |
clave_windows | character varying |
email | character varying |
usuario_correo | character varying |
clave_correo | character varying |
ext | integer |
tipo_linea | character varying |
tel_libre | boolean |
celular | numeric(14,0) |
plan_celular | character varying |
foto | bytea |
userbd | name | not null valor por
omisin getpgusername()
timeupdate | timestamp(0) without time zone | not null valor por
omisin now()
-ndices:
"usuario_celular_key" UNIQUE, btree (celular)
"usuario_id_key" UNIQUE, btree (id)
"usuario_id_usuario_key" UNIQUE, btree (id_usuario)
"usuario_usuario" UNIQUE, btree (id_usuario, nombre, apellido, email)
Referenciada por:
TABLE "carpetas" CONSTRAINT "carpetas_usuario" FOREIGN KEY (id_usuario)
REFERENCES usuario(id_usuario) ON UPDATE CASCADE
TABLE "equipo" CONSTRAINT "equipo_usuario" FOREIGN KEY (id_usuario)
REFERENCES usuario(id_usuario) ON UPDATE CASCADE
TABLE "internet" CONSTRAINT "internet_fk" FOREIGN KEY (id_usuario)
REFERENCES usuario(id_usuario) ON UPDATE CASCADE
Triggers:
grabar_usuario AFTER INSERT OR DELETE OR UPDATE ON usuario FOR EACH
STATEMENT EXECUTE PROCEDURE procesa_usuario_audit()
Este es el trigger:
CREATE TRIGGER grabar_usuario AFTER INSERT OR DELETE OR UPDATE ON usuario
FOR EACH STATEMENT EXECUTE PROCEDURE procesa_usuario_audit();
Esta es la tabla donde ingresa los datos el trigger: tabla usuario_audit
Columna | Tipo
| Modificadores
------------+-----------------------------+-----------------------------------------------------------------------------------
id_audit | integer | not null valor por omisin
nextval('usuario_audit_id_usuario_audit_seq'::regclass)
operacion | character(1) | not null
timeupdate | timestamp without time zone | not null
userbd | text | not null
id_usuario | integer | not null
-ndices:
"usuario_audit_pkey" PRIMARY KEY, btree (id_audit)
------------------------------------------------------------------------------------------------------------------------
Este es el mensaje de error:
Ejecuto un update o insert en la tabla usuario:
soporte=# update usuario set depto = 'Administracion' where id_usuario =
514;
ERROR: el registro «new» no ha sido asignado aún
DETALLE: La estructura de fila de un registro aún no asignado no está
determinado.
CONTEXTO: función PL/pgSQL «procesa_usuario_audit» en la lÃnea 10 en
sentencia SQL
soporte=#
Ejecuto la instruccion de manera directa del trigger (ver funcion):
soporte=# INSERT INTO usuario_audit SELECT
nextval('usuario_audit_id_usuario_audit_seq'::regclass),'I', now(), user, 8;
INSERT 92551 1
soporte=# INSERT INTO usuario_audit SELECT
nextval('usuario_audit_id_usuario_audit_seq'::regclass),'U', now(), user, 8;
INSERT 92552 1
(resultado OK)
reviso la tabla afectada:
soporte=# select * from usuario_audit;
id_audit | operacion | timeupdate | userbd | id_usuario
----------+-----------+-------------------------+--------+------------
10 | I | 2011-04-18 15:05:05.917 | miguel | 8
11 | I | 2011-04-18 15:05:11.839 | miguel | 8
12 | U | 2011-04-18 15:10:57.464 | miguel | 8
(3 filas)
No entiendo que pasa, ya realize pruebas con BEFORE y no funciona, en teoria
funciona con AFTER segun ejemplos tomados en la red (Yo practique con los
ejemplos y funcionan con AFTER)
Alguna sugerencia?
Desde ya, muchas gracias.
soporte=# select * from version();
version
-------------------------------------------------------------
PostgreSQL 8.4.4, compiled by Visual C++ build 1400, 32-bit
(1 fila)
desde Win XP Pro
--
Miguel Angel Torres
Culiacan, Sin.
From | Date | Subject | |
---|---|---|---|
Next Message | Gustavo Garay | 2011-04-18 21:34:26 | Re: error en ejecucion de trigger |
Previous Message | adriana camargo | 2011-04-18 20:52:13 | Ayuda migrar de 8.1 a 9.0 |