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

Como crear triggers

Estas en el tema de Como crear triggers en el foro de Mysql en Foros del Web. Hola Como puedo crear un trigger cada vez que se modifique un campo en la tabla articulos y que me diga que usuario lo hizo, ...
  #1 (permalink)  
Antiguo 11/07/2011, 18:05
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Como crear triggers

Hola Como puedo crear un trigger cada vez que se modifique un campo en la tabla articulos y que me diga que usuario lo hizo, gracias.

Y por ultimo esto en donde queda guardado ? soy nuevo con esto de los triggers
  #2 (permalink)  
Antiguo 11/07/2011, 18:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como crear triggers

Los TRIGGERS no producen salida de datos. En ese sentido no pueden devolverte datos por sí mismos, aunque si se pueden usar variables de usuario para obtener algún retorno.
En cuanto a lo de los usuarios, la unica información de usuarios que puede aportar es del usuario dueño de la conexión a MySQL. Si los usuarios los administras independientemente, es decir que en tu base tienes una tabla "usuarios", eso no se puede saber por medio de MySQL, si no estan registrados en el MySQL mismo.
¿Se entiende?
Los TRIGGERs se almacenan en una tabla específica de la base information_schema, y también en archivos .TRG en la base donde está la tabla a la cual el TRIGGER pertenece.

Consejo: Procura leer un poco más sobre el tema antes de meterte a trabajar con ellos. COmo mínimo, lee el tema en Wikipedia: Trigger (base de datos)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/07/2011, 18:17
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Como crear triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Los TRIGGERS no producen salida de datos. En ese sentido no pueden devolverte datos por sí mismos, aunque si se pueden usar variables de usuario para obtener algún retorno.
En cuanto a lo de los usuarios, la unica información de usuarios que puede aportar es del usuario dueño de la conexión a MySQL. Si los usuarios los administras independientemente, es decir que en tu base tienes una tabla "usuarios", eso no se puede saber por medio de MySQL, si no estan registrados en el MySQL mismo.
¿Se entiende?
Los TRIGGERs se almacenan en una tabla específica de la base information_schema, y también en archivos .TRG en la base donde está la tabla a la cual el TRIGGER pertenece.

Consejo: Procura leer un poco más sobre el tema antes de meterte a trabajar con ellos. COmo mínimo, lee el tema en Wikipedia: Trigger (base de datos)
Tengo lo siguiente buscando en la red
Código:
CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON activo 
   FOR EACH ROW
   INSERT INTO auditoria(serialemp, descripcion, usuario, modificado )
   VALUES (OLD.serialemp, OLD.descripcion, CURRENT_USER(), NOW() );
y hace en cierta parte lo que necesito pero como hago si quiero que me guarde el usuario "administrador" osea con el cual me logueo y no el que me guarda que me dice "root@localhost" y que me guarde el valor anterior y el nuevo, ya que me guarda el valor antiguo
  #4 (permalink)  
Antiguo 11/07/2011, 18:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como crear triggers

¿Leíste bien lo que te puse?
Cita:
Si los usuarios los administras independientemente, es decir que en tu base tienes una tabla "usuarios", eso no se puede saber por medio de MySQL, si no estan registrados en el MySQL mismo.
El tema es simple: La conexión que usas le pertenece al root (muy mal hecho por cierto, ese usuario no se debe utilizar si no es para tareas administrativas). Es con el username root con el que abres la conexión, y para MySQL ese es el único usuario que está. Los usuarios que administres en tu base por programación, no existen para MySQL. Sólo existen para tu aplicación.
¿Se comprende la diferencia?
La única solución que yo le veo q lo que quieres hacer es, apenas abres la conexión, cargar una variable de usuario con el nombre del usuario que se loguea en tu programa:
Código MySQL:
Ver original
  1. SET @usuario = 'administrador';
y recién entonces hacer el insert que dispare el trigger.
Pero el trigger debería tener esta sintaxis:
Código MySQL:
Ver original
  1. CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON activo
  2.    INSERT INTO auditoria(serialemp, descripcion, usuario, modificado )
  3.    VALUES (OLD.serialemp, OLD.descripcion, @usuario, NOW());
Como las variables de usuario existen sólo en la conexión donde se usan, y mientras la conexión no se cierre, no te traerán problemas ni con la memoria, ni con otros usuarios (dos conexiones diferentes del mismo usuario pueden utilizar el mismo nombre de variable y diferente contenido sin que se generen conflictos).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 11/07/2011 a las 18:40
  #5 (permalink)  
Antiguo 11/07/2011, 18:49
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Como crear triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Leíste bien lo que te puse?
El tema es simple: La conexión que usas le pertenece al root (muy mal hecho por cierto, ese usuario no se debe utilizar si no es para tareas administrativas). Es con el username root con el que abres la conexión, y para MySQL ese es el único usuario que está. Los usuarios que administres en tu base por programación, no existen para MySQL. Sólo existen para tu aplicación.
¿Se comprende la diferencia?
La única solución que yo le veo q lo que quieres hacer es, apenas abres la conexión, cargar una variable de usuario con el nombre del usuario que se loguea en tu programa:
Código MySQL:
Ver original
  1. SET @usuario = 'administrador';
y recién entonces hacer el insert que dispare el trigger.
Pero el trigger debería tener esta sintaxis:
Código MySQL:
Ver original
  1. CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON activo
  2.    INSERT INTO auditoria(serialemp, descripcion, usuario, modificado )
  3.    VALUES (OLD.serialemp, OLD.descripcion, @usuario, NOW());
Como las variables de usuario existen sólo en la conexión donde se usan, y mientras la conexión no se cierre, no te traerán problemas ni con la memoria, ni con otros usuarios (dos conexiones diferentes del mismo usuario pueden utilizar el mismo nombre de variable y diferente contenido sin que se generen conflictos).
Es que el root lo estoy utilizando desde otro pc que no administro yo, pero te pregunto ese "SET" como y donde lo podria declarar ? es que a veces no me ejecutan unas consultar segun donde lo coloque gracias
  #6 (permalink)  
Antiguo 11/07/2011, 19:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como crear triggers

Esa primera consulta se debe enviar antes del UPDATE que dispara el trigger, o bien luego de abrir la conexión. Como te expliqué claramente, el único sentido es el de crear una variable de usuario dentro del MySQL, que luego pueda usarse para almacenar ese dato, que no pertenece ni se puede obtener por una consulta de MySQL.
Ten en cuenta que yo no tengo ni idea de qué estás haciendo, cómo lo estás programando o qué estás usando para probar las consultas, por cuanto no has comentado sobre esos temas absolutamente nada.

Simplemente te estoy dando pautas a nivel de MySQL.

Trata de dar información más concreta, o de lo contrario no podemos saber por qué hay consultas que no te funcionan, ni si lo estás haciendo o no correctamente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/07/2011, 19:37
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Como crear triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Esa primera consulta se debe enviar antes del UPDATE que dispara el trigger, o bien luego de abrir la conexión. Como te expliqué claramente, el único sentido es el de crear una variable de usuario dentro del MySQL, que luego pueda usarse para almacenar ese dato, que no pertenece ni se puede obtener por una consulta de MySQL.
Ten en cuenta que yo no tengo ni idea de qué estás haciendo, cómo lo estás programando o qué estás usando para probar las consultas, por cuanto no has comentado sobre esos temas absolutamente nada.

Simplemente te estoy dando pautas a nivel de MySQL.

Trata de dar información más concreta, o de lo contrario no podemos saber por qué hay consultas que no te funcionan, ni si lo estás haciendo o no correctamente.
Vale cuando me dices a nivel MYSQL me dices que lo cree dentro de mysql mas no php ? dime como haria para crear ese "SET", para lo de la consulta que hablo es la siguiente
Código PHP:
$q sprintf("INSERT INTO sesiones SET fechaentrada=NOW(),horaentrada=NOW() WHERE usuario='".$_SESSION['MM_Username']."'"); 
no se porque no me funciona pero si cojo desdel el "INSERT hasta horaentrada=NOW()" y lo ejecuto directamente en mysql me sirve pero si lo dejo asi como te digo en un archivo php no me funciona a que se debe ? la .$_SESSION..... es donde guardo el usuario que inicia sesion
  #8 (permalink)  
Antiguo 11/07/2011, 20:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como crear triggers

Mmmm... Necesitas leer un poco más de SQL , estás confundiendo la sintaxis de UPDATE con la de INSERT, y las funciones que necesitas (NOW() devuelve un DateTime, y tu tienes el par de datos en dos campos distintos).
Código MySQL:
Ver original
  1. INSERT INTO sesiones(fechaentrada, horaentrada, usuario)
  2. VALUES(CURDATE(),CURTIME(), '$_SESSION['MM_Username']'

El SET al que te refieres no es el SET del UPDATE. En ese caso es una cláusula del UPDATE, mientras que cuando se ejecuta directamente es una sentencia de asignación de una valor en una variable.
Código MySQL:
Ver original
  1. SET @usuario = 'administrador';
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 11/07/2011 a las 20:42
  #9 (permalink)  
Antiguo 11/07/2011, 22:04
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Como crear triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Mmmm... Necesitas leer un poco más de SQL , estás confundiendo la sintaxis de UPDATE con la de INSERT, y las funciones que necesitas (NOW() devuelve un DateTime, y tu tienes el par de datos en dos campos distintos).
Código MySQL:
Ver original
  1. INSERT INTO sesiones(fechaentrada, horaentrada, usuario)
  2. VALUES(CURDATE(),CURTIME(), '$_SESSION['MM_Username']'

El SET al que te refieres no es el SET del UPDATE. En ese caso es una cláusula del UPDATE, mientras que cuando se ejecuta directamente es una sentencia de asignación de una valor en una variable.
Código MySQL:
Ver original
  1. SET @usuario = 'administrador';
Vale gracias por la aclaracion ahora te pregunto, dentro de un archivo.php no importa donde valla ubicada la consulta o la actualizacion de lo que se valla a realizar ? o debe estar en algun orden ? y si yo quisiera que en vez de ese
Código MySQL:
Ver original
  1. SET @usuario = 'administrador';
FUERA UN
Código MySQL:
Ver original
  1. SET @usuario = '$_SESSION['MM_Username']';
como lo podria hacer, estube leyendo y ese SET dice que se declara dentro del MYSQL
  #10 (permalink)  
Antiguo 12/07/2011, 03:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como crear triggers

Te aclaro los detalles:

1) Yo sólo te estoy diciendo cómo se crea una variable de usuario en MySQL, no qué quieres cargar en ella. Eso es tu decisión. Si quieres poner una letra, una cadena, un número, para el caso es igual y dependerá de lo que necesites poner en esa variable.

2) Las variables de usuario no se declaran, se inicializan. Se pueden usar sin inicializar, pero entonces su valor es NULL, por eso se debe asignar un valor antes de usarlas, aunque más no sea para definir el tipo de datos que manejarán. Sólo se declaran las variables locales de los stored procedures, functions y triggers, pero esas no llevan "@" y no se pueden usar fuera de esas rutinas.

3) Si vas a usar el valor, como en cualquier lenguaje, debes cargar la variable antes, de lo contrario el valor no existirá. En dónde lo pongas en tu script PHP dependerá de tí. Yo te sugerí dos opciones prácticas, el resto dependerá de la lógica de tu programación. Por eso mi sugerencia es hacerlo después de abrir la conexión.

4) Ten en cuenta que las variables de usuario dependen del subproceso de conexión, mueren al cerrarse la misma. Mientras tanto conservan el valor que se les asigne la última vez (esto permite hacer consultas con un grado de dinamismo notable).


5) SET, dentro de otras sentencias es cláusula, fuera de toda sentencia es sentencia porque los contextos son distintos, y como tal se usa en los scripts de PHP: como otra sentencia más de SQL, pero sólo para las variables de usuario.

Si quieres ver algunos usos de las variables de usuario, lee las FAQs de MySQL:
¿Cómo numerar secuencialmente una consulta, sin usar PK?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 12/07/2011 a las 06:15
  #11 (permalink)  
Antiguo 13/07/2011, 18:14
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Como crear triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Te aclaro los detalles:

1) Yo sólo te estoy diciendo cómo se crea una variable de usuario en MySQL, no qué quieres cargar en ella. Eso es tu decisión. Si quieres poner una letra, una cadena, un número, para el caso es igual y dependerá de lo que necesites poner en esa variable.

2) Las variables de usuario no se declaran, se inicializan. Se pueden usar sin inicializar, pero entonces su valor es NULL, por eso se debe asignar un valor antes de usarlas, aunque más no sea para definir el tipo de datos que manejarán. Sólo se declaran las variables locales de los stored procedures, functions y triggers, pero esas no llevan "@" y no se pueden usar fuera de esas rutinas.

3) Si vas a usar el valor, como en cualquier lenguaje, debes cargar la variable antes, de lo contrario el valor no existirá. En dónde lo pongas en tu script PHP dependerá de tí. Yo te sugerí dos opciones prácticas, el resto dependerá de la lógica de tu programación. Por eso mi sugerencia es hacerlo después de abrir la conexión.

4) Ten en cuenta que las variables de usuario dependen del subproceso de conexión, mueren al cerrarse la misma. Mientras tanto conservan el valor que se les asigne la última vez (esto permite hacer consultas con un grado de dinamismo notable).


5) SET, dentro de otras sentencias es cláusula, fuera de toda sentencia es sentencia porque los contextos son distintos, y como tal se usa en los scripts de PHP: como otra sentencia más de SQL, pero sólo para las variables de usuario.

Si quieres ver algunos usos de las variables de usuario, lee las FAQs de MySQL:
¿Cómo numerar secuencialmente una consulta, sin usar PK?
Mira tengo este codigo

Código PHP:
$usuario=$loginUsername// SI esto no existiera ?
Podria declarar
SET $usuario
:"$loginUsername"// claro que ese $ del usuario no puede ir segun lo que lei
$hora=date('H:i:s');
$fecha=date('Y/m/d');
$insertsesion sprintf("INSERT INTO sesiones (usuario, horaentrada, fechaentrada) VALUES (%s, %s, %s)",
                       
GetSQLValueString($usuario"text"),
                       
GetSQLValueString($hora"time"),
                       
GetSQLValueString($fecha"date")); 
en este caso el usuario se esta guardando bien, pero si no lo tuviera declarado con el $usuario como lo podria declara en ese "SET" para que lo guardara dentro de la consulta asi la consulta estaria bien ?
  #12 (permalink)  
Antiguo 13/07/2011, 20:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como crear triggers

Tengo la impresión de que estás complicándolo innecesariamente.
Esto devuelve un sólo valor:
Código MySQL:
Ver original
  1. (SELECT max(id_requisicion) FROM facturas2)
Entonces esto debería devolver un sólo registro, si id_requisicion es único:
Código MySQL:
Ver original
  1. SELECT id_requisicion, descripcion, cantidad, id_articulo
  2. FROM facturas2
  3. WHERE id_requisicion = (SELECT max(id_requisicion) FROM facturas2)
En ese caso, esto sería redundante:
Código MySQL:
Ver original
  1. SELECT t1.id_requisicion, t1.descripcion, t1.cantidad, t1.id_articulo
  2.         (SELECT id_requisicion, descripcion, cantidad, id_articulo
  3.         FROM facturas2
  4.         WHERE id_requisicion = (SELECT max(id_requisicion) FROM facturas2) )t1
  5. GROUP BY t1.cantidad, t1.descripcion
Porque agrupar sobre una consulta que devuelve un sólo registro, es verdaderamente redundante.
En ese caso, el resto de los campos son innecesarios, así que esto:
Código MySQL:
Ver original
  1. UPDATE `activo`
  2.     INNER JOIN
  3.     (SELECT t1.id_requisicion, t1.descripcion, t1.cantidad, t1.id_articulo
  4.     FROM    (SELECT id_requisicion, descripcion, cantidad, id_articulo
  5.             FROM facturas2
  6.             WHERE id_requisicion = (SELECT max(id_requisicion) FROM facturas2) )t1
  7.     GROUP BY t1.cantidad, t1.descripcion)t2 ON activo.descripcion = t2.descripcion
  8. SET activo.cantidad = activo.cantidad - t2.cantidad
por lo que bien podría escribirse así:
Código MySQL:
Ver original
  1. UPDATE `activo` A
  2.     INNER JOIN
  3.     (SELECT descripcion, cantidad FROM facturas2 ORDER BY id_requisicion DESC LIMIT 1) t2
  4.     ON A.descripcion = t2.descripcion
  5. SET A.cantidad = A.cantidad - t2.cantidad
Y el resultado debería ser el mismo.

Mi duda es que no termino de comprender qué es lo que estás buscando, porque agrupar por descripción y por cantidad, cuando estás buscando el id_requisición, no parece muy razonable.

¿Podrías explicar un poco mejor qué es lo que buscas y qué es lo que quieres actualizar.

Lo que si me parece dudoso es que el campo que relacione la tabla ACTIVO con FACTURAS2 sea descripcion. Un campo de texto no me parece una buena idea como FK.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 19/07/2011, 08:34
 
Fecha de Ingreso: enero-2010
Mensajes: 302
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Como crear triggers

GNZSLOYO no se porque colocas eso, antes de este mensaje, lo que busco es guardar el usuario en el triggers
Código PHP:
$usuario=$loginUsername// SI esto no existiera ? 
Podria declarar 
SET $usuario
:"$loginUsername"// claro que ese $ del usuario no puede ir segun lo que lei 
$hora=date('H:i:s'); 
$fecha=date('Y/m/d'); 
$insertsesion sprintf("INSERT INTO sesiones (usuario, horaentrada, fechaentrada) VALUES (%s, %s, %s)"
                       
GetSQLValueString($usuario"text"), 
                       
GetSQLValueString($hora"time"), 
                       
GetSQLValueString($fecha"date")); 
tengo este codigo el cual me guarda el usuario cuando inicia sesion, me dices que el SET se declara pero como una valor "TOTAL" osea si coloco "SET a" siempre me va a guardar "a" pero si quiero que ese SET guarde a veces a, b dependiendo de que usuario realizara la modificacion

Etiquetas: tabla, 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 02:34.