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

triggers

Estas en el tema de triggers en el foro de PostgreSQL en Foros del Web. quisera que alguien me responda sobre si es posible pasarle un parametro a una funcion que dispara un trigger. saludos....
  #1 (permalink)  
Antiguo 10/05/2010, 12:26
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
triggers

quisera que alguien me responda sobre si es posible pasarle un parametro a una funcion que dispara un trigger.
saludos.
  #2 (permalink)  
Antiguo 10/05/2010, 20:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: triggers

No se puede.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 11/05/2010, 06:26
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: triggers

hola hueso pero no puede existir otra variante .
  #4 (permalink)  
Antiguo 11/05/2010, 06:36
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: triggers

yoelvis, explica un poco que quieres hacer y miramos que solución se le puede dar.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 12/05/2010, 07:56
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: triggers

Cita:
Iniciado por huesos52 Ver Mensaje
yoelvis, explica un poco que quieres hacer y miramos que solución se le puede dar.

saludos
Hola hueso

Mira deseo hacer un trigger para auditar unas tablas, pero deseo que cuando se dispare el trigger llame a una función que le pase a una tabla de trazas además de las modificaciones, el usuario que las hizo (no el usuario con el que estoy conectado a la bd, sino uno php por ejemplo)

algo por el estilo de esto:

CREATE OR REPLACE FUNCTION "public"."function1" () RETURNS trigger AS
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO empleados_audit SELECT 'D', now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO empleados_audit SELECT 'U', now(), user,
NEW.empleado_nombre, NEW.salario;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO empleados_audit SELECT 'I', now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL;
END;


****************** Pero que en vez de pasarle el usuario de la bd (que accedo a su valor con user), le pueda pasar un valor para colocar en la tabla de destino .....

muchas gracias de antemano ...
  #6 (permalink)  
Antiguo 12/05/2010, 08:48
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: triggers

Que onda Yoelvis.
Mira aqui te dejo algo que lei sobre los trigger es muy util y a mi me ayudo demaciado.
Una de las caracteristicas de los triggers es que no le puedes enviar argumentos a la funcion y la funcion debera retornar un trigger

Te dejo aqui la fuente.
http://www.postgresql-es.org/node/301

Yo hice algo parecido.
en la tabla donde estaras verificando las acciones agregue un campo que se llama usuario cuando hacia unaaccion sobre la misma tabla guardaba el usuario y despues ejecutaba el trigger y me traia el usuario de la old.
asi lo resolvi.

espero que eso te sirva o de menos te de una idea.
cuidate y si lo solucionas nos dices como.
  #7 (permalink)  
Antiguo 12/05/2010, 08:55
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: triggers

En este caso te propongo algo que no me gusta mucho, pero que puede funcionarte.

Y es hacer uso de rules.

Es un mecanismo similar a los triggers pero que no afecta cada registro, sino un conjunto de reglas.

Lo que te digo que no me gusta, es hacer un create replace de la regla cada que haya una inserción u operación DML para poder capturar el usuario que dices es el parametro.

Te lo muestro en este ejemplo:
Código SQL:
Ver original
  1. pruebas=> CREATE TABLE yoelvis(id INTEGER);
  2. CREATE TABLE
  3. pruebas=> CREATE TABLE yoelvis_auditoria(fecha DATE,id INTEGER);
  4. CREATE TABLE
  5. pruebas=> CREATE OR REPLACE RULE yoelvis_insert AS ON INSERT TO yoelvis DO INSERT INTO yoelvis_audit
  6. oria VALUES(TO_DATE('1984-11-12','YYYY-MM-DD'),NEW.id);
  7. CREATE RULE
  8. pruebas=> INSERT INTO yoelvis VALUES(1);
  9. INSERT 0 1
  10. pruebas=> INSERT INTO yoelvis VALUES(2);
  11. INSERT 0 1
  12. pruebas=> SELECT *FROM yoelvis_auditoria;
  13.    fecha    | id
  14. ------------+----
  15.  1984-11-12 |  1
  16.  1984-11-12 |  2
  17. (2 filas)
  18.  
  19. pruebas=> CREATE OR REPLACE RULE yoelvis_insert AS ON INSERT TO yoelvis DO INSERT INTO yoelvis_audit
  20. oria VALUES(TO_DATE('1984-11-13','YYYY-MM-DD'),NEW.id);
  21. CREATE RULE
  22. pruebas=> INSERT INTO yoelvis VALUES(1);
  23. INSERT 0 1
  24. pruebas=> SELECT *FROM yoelvis_auditoria;
  25.    fecha    | id
  26. ------------+----
  27.  1984-11-12 |  1
  28.  1984-11-12 |  2
  29.  1984-11-13 |  1
  30. (3 filas)

En este caso, la fecha se comporta como el parámetro de entrada (Que en tu caso sería el usuario) pero ara que sea dinámico, requiere ejecutar el CREATE OR REPLACE RULE desde el lenguaje para que inserte el valor que se espera.

Yo realmente optaría por añadir a cada tabla original un campo para almacenar el user y pasarselo como valor NEW u OLD al trigger y que haga la operación DML automática.

EDITO: se me adelantó calakra
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 13/05/2010, 07:08
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: triggers

Calakra esa es la opcion que he visto mas factible puedes ponerme un ejemplo de como llamas despues al usuario en cada funcion por que lo que quiero auditar on 5 o 6 tablas importantes y a la hora de realizar la funcion solo el insert me crea las trazas bien..

Última edición por yoelvis; 13/05/2010 a las 07:15
  #9 (permalink)  
Antiguo 13/05/2010, 07:16
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: triggers

Calakra esa es la opcion que he visto mas factible puedes ponerme un ejemplo de como llamas despues al usuario en cada funcion por que lo que quiero auditar on 5 o 6 tablas importantes y a la hora de realizar la funcion solo el insert me crea las trazas bien..

Etiquetas: trigger
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 10:32.