Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

TRIGGERS, NEW y OLD, disparadores postgresql

Estas en el tema de TRIGGERS, NEW y OLD, disparadores postgresql en el foro de PostgreSQL en Foros del Web. Estoy trabajando con una funcion disparadora en mi base de datos para la auditoria, deseo crear un disparador por cada tabla para llamar a esta ...
  #1 (permalink)  
Antiguo 22/03/2007, 10:51
 
Fecha de Ingreso: agosto-2006
Mensajes: 179
Antigüedad: 17 años, 8 meses
Puntos: 0
Busqueda TRIGGERS, NEW y OLD, disparadores postgresql

Estoy trabajando con una funcion disparadora en mi base de datos para la auditoria, deseo crear un disparador por cada tabla para llamar a esta funcion, pero deseo recorrer los campos de las variables NEW y OLD, pero no he podido hacerlo, tengo una tabla usuario con dos campos login y nombre, esos campos se los paso por parametros a la funcion osea los argumentos que envio son login,nombre, lo que deseo es traer los valores de esos campos pero de las variables NEW y OLD, estoy trabajando con plpgsql, se que con pltcl se puede, asi que creo que con plpgsql tambien, el problema es que no se como lo he intentado asi pero no funciona:
NEW."|| TG_ARGV[0] ||",
NEW["|| TG_ARGV[0] ||"]
NEW("|| TG_ARGV[0] ||")

De ninguna manera funciona, agradeceria si me pueden colaborar, de antemano muchas gracias.
  #2 (permalink)  
Antiguo 22/03/2007, 12:59
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
Re: TRIGGERS, NEW y OLD, disparadores postgresql

Saludos...

Nunca he trabajado con pltcl, más sí con plpgsql, y mis auditorías las hago por ahí...

De lo tuyo, por qué no pegas al menos un pedazo de tu código? a ver si así se entiende más lo que haces....
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 22/03/2007, 13:21
 
Fecha de Ingreso: agosto-2006
Mensajes: 179
Antigüedad: 17 años, 8 meses
Puntos: 0
Pregunta Re: TRIGGERS, NEW y OLD, disparadores postgresql

Necesito traer los valores de los campos de las variables NEW y OLD de la siguiente forma:

Como argumento envio los nombres de los campos que quiero buscar:

codigo,nombre donde codigo es el argumento1 y nombre el argumento2 ahora necesito algo como lo siguiente:

DECLARE
var_codigo varchar;
var_nombre varchar;
BEGIN
var_codigo:=NEW." || TG_ARGV[0] || "; -- var_codigo= al valor del campo
codigo del RECORD NEW
var_nombre:=NEW." || TG_ARGV[1] || "; -- var_nombre= al valor del campo nombre del RECORD NEW

Luego:
INSERT INTO AUDITORIA (campo1,campo2) VALUES (var_codigo,var_nombre);
RETURN NEW;
END;

Esto es mas o menos lo que quiero hacer; se preguntaran para que: Pues tengo + de 50 tablas y me pareceria muy largo realizar una funcion disparadora para cada tabla, asi que yo en cada tabla creo un disparador con los campos que deseo guardar y listo, esta parte es lo unico que no funciona.

Agradeceria si me pueden colaborar... Muchas gracias!!
  #4 (permalink)  
Antiguo 22/03/2007, 13:23
 
Fecha de Ingreso: agosto-2006
Mensajes: 179
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: TRIGGERS, NEW y OLD, disparadores postgresql

Perdón, aclaro lo que no funciona:
DECLARE
var_codigo varchar;
var_nombre varchar;
BEGIN
var_codigo:=NEW." || TG_ARGV[0] || "; -- var_codigo= al valor del campo
codigo del RECORD NEW
var_nombre:=NEW." || TG_ARGV[1] || "; -- var_nombre= al valor del campo nombre del RECORD NEW


Gracias.
  #5 (permalink)  
Antiguo 22/03/2007, 15:56
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
Re: TRIGGERS, NEW y OLD, disparadores postgresql

Me está costando entender, pero vamos a ver...

por qué no usas simplemente, NEW.TG_ARGV

sin concatenar nada...
__________________
Gracias de todas todas
-----
Linux!
  #6 (permalink)  
Antiguo 22/03/2007, 16:03
 
Fecha de Ingreso: agosto-2006
Mensajes: 179
Antigüedad: 17 años, 8 meses
Puntos: 0
Pregunta Re: TRIGGERS, NEW y OLD, disparadores postgresql

Lo he intentado de muchas formas pero no funciona, si alguien lo sabe entonces simplemente diga como.

Lo he intentado asi:
NEW.TG_ARGV[0];
NEW."TG_ARGV[0]";
NEW[TG_ARGV[0]];
NEW(TG_ARGV[0]);
NEW.'TG_ARGV[0]';
NEW.' || TG_ARGV[0] || ';
NEW." || TG_ARGV[0] || ";

Y aun no funciona , la otra forma que veo ahora que lo podria hacer es buscando a ver si existe una funcion que me convierta una variable tipo RECORD en un vector o un array.

Gracias de todas maneras...
  #7 (permalink)  
Antiguo 16/05/2007, 17:17
 
Fecha de Ingreso: febrero-2007
Ubicación: Ecuador
Mensajes: 23
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: TRIGGERS, NEW y OLD, disparadores postgresql

ha ver si entendi tienes esto
table(
login,
nombre)

primero crea el lenguaje plpgsql

crea el trigger pero por cada linea llama a una funcion (asi es mejor)
por ejemplo

CREATE FUNCTION proces_ejemplo() RETURNS trigger AS $TG_ejemplo$
DECLARE
nombre varchar(10);
BEGIN
IF (TG_OP = 'INSERT') then
nombre=new.nombre;
ELSIF (TG_OP = 'update') then
nombre=old.nombre;
END IF;
RETURN NEW;
END;
$TG_ejemplo$ LANGUAGE plpgsql;

CREATE TRIGGER TG_ejemplo after INSERT OR UPDATE ON usuario
FOR EACH ROW EXECUTE PROCEDURE proces_ejemplo();


la variable que declare dentro de la funcion proces_ejemplo(); puede tomar cualquier nombre, no es nesesario enviar ninguna variable estas new ni old estas se crean automaticamente al igual que la variable TG_OP


espero esto te ayude sino hay nos avisa


¡que viva el software libre!
  #8 (permalink)  
Antiguo 24/10/2010, 03:20
 
Fecha de Ingreso: octubre-2010
Mensajes: 2
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Re: TRIGGERS, NEW y OLD, disparadores postgresql

una pregunta.. si yo creo un trigger que se dispare luego de una insertar en una tabla xq no se inserta primero en la tabla y despues se ejecuta?.. la funcion es la siguiente:

create or replace function venta () returns TRIGGER as $venta$
DECLARE
local usuario%ROWTYPE;
BEGIN
select into local localidad from usuario where id=new.id_usuario;
INSERT INTO venta VALUES(new.id_b,new.cedula,new.id_usuario,new.fech a,new.costo,local);
RETURN new;
END;
$venta$ language 'plpgsql';

el trigger es este:

create trigger venta AFTER insert on boleto for each row execute procedure venta();

mi inconveniente esta en que en la tabla venta, los primeros dos campos el id y la cedula son claves foraneas de la misma tabla boleto donde estoy aplicando el trigger.. si estoy diciendo que el trigger se dispare "AFTER insert on boleto" xq me da error de clave foranea en la tabla venta y nunk se logra insertar ni en boleto ni tampoco en venta...

gracias de antemano!! espero sus respuestas y opiniones...

Última edición por omarcortezc; 24/10/2010 a las 03:30
  #9 (permalink)  
Antiguo 31/03/2011, 10:27
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
Respuesta: TRIGGERS, NEW y OLD, disparadores postgresql

@rusinho

Mira esto: http://www.alberton.info/postgresql_table_audit.html
__________________
Gracias de todas todas
-----
Linux!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:43.