Autor Tema: Creación de triggers en MySQL  (Leído 8878 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado better.jq

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 0
  • -Receive: 1
  • Mensajes: 46
  • Debo aprender que nunca dejaré de aprender
Creación de triggers en MySQL
« : noviembre 04, 2009, 11:53:04 am »
La sentencia normal para crear un trigger es por ejemplo:

CREATE TRIGGER `personal`.`tri_del_EscribirBitacora` AFTER DELETE
    ON personal.personal FOR EACH ROW
      insert into personal.bitacoratransaccioes
      (username,hostname,`sql`,tabla,fecha,hora)
      values   
      (USER(),'hostname','delete','personal',CURDATE(),CURTIME());

Pero con esto para llevar una bitácora de transacciones necesitaría crear tres triggers para cada tabla de cada BD(el de ins, upd y del), mi pregunta es si habrá una manera de que en un solo trigger pueda cotrolar para una tabla el insert, update y delete? o alguna otra solución para el control de las transacciones sin que el usuario ni el programador  :no: se de cuenta?? :ok:
« Última Modificación: noviembre 04, 2009, 12:25:32 pm por better.jq »

Desconectado cazko

  • Trade Count: (3)
  • Sv Member
  • ***
  • Thank You
  • -Given: 0
  • -Receive: 0
  • Mensajes: 147
Re:Creación de triggers en MySQL
« Respuesta #1 : noviembre 04, 2009, 03:17:45 pm »
Hace un tiempo hice algo similar pero en oracle, si mal no recuerdo la estructura que use era asi:

CREATE TRIGGER nombre_trigger AFTER INSERT OR UPDATE OR DELETE ON nombre_tabla
FOR EACH ROW

BEGIN

IF DELETING THEN
.....<sentencias para delete>

ELSIF UPDATING THEN
....<sentencias para update>

...etc...

END

Asumo que debe haber un equivalente para mysql, ojala te sirva.  :thumbsup:

Desconectado tekun

  • -^- Elite Silver -^-
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 101
  • Mensajes: 3193
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:Creación de triggers en MySQL
« Respuesta #2 : noviembre 04, 2009, 03:22:35 pm »
busca si el gran MySQL soporta en las definiciones de trigger algo así:

Código: [Seleccionar]
BEFORE INSERT OR UPDATE OR DELETE


viendo el squema de las tablas, no entiendo la razon de ser de esa bitacora de transacciones.
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado better.jq

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 0
  • -Receive: 1
  • Mensajes: 46
  • Debo aprender que nunca dejaré de aprender
Re:Creación de triggers en MySQL
« Respuesta #3 : noviembre 05, 2009, 10:38:13 am »
busca si el gran MySQL soporta en las definiciones de trigger algo así:

Código: [Seleccionar]
BEFORE INSERT OR UPDATE OR DELETE
viendo el squema de las tablas, no entiendo la razon de ser de esa bitacora de transacciones.

Lástimosamente no fuciona...pero a que te refieres cuando hablas del squema de las tablas??
Porque en la tabla bitácora escribiría las transacciones que se realicen sobre la tabla, vengan de donde vengan...

Desconectado vlad

  • Global Moderator
  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 104
  • Mensajes: 6366
    • Qualium.net
Re:Creación de triggers en MySQL
« Respuesta #4 : noviembre 05, 2009, 01:01:42 pm »
Si tenes acceso al servidor entonces te conviene mejor utilizar esta opción del gran MySQL:
5.2.3. The General Query Log
Citar
The general query log is a general record of what mysqld is doing. The server writes information to this log when clients connect or disconnect, and it logs each SQL statement received from clients.


Citar
As of MySQL 5.1.6, the destination can be a file or a table, or both.

Desconectado tekun

  • -^- Elite Silver -^-
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 101
  • Mensajes: 3193
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re:Creación de triggers en MySQL
« Respuesta #5 : noviembre 05, 2009, 06:45:35 pm »
pero a que te refieres cuando hablas del squema de las tablas??
Porque en la tabla bitácora escribiría las transacciones que se realicen sobre la tabla, vengan de donde vengan...

me refiero a que sentido tiene una tabla donde solo se guarde.
Citar
tekun desde su computadora hiso un delete en clientes, este día y a estas horas

yo esperaría saber que registro elimino y cosas como esas...
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado better.jq

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 0
  • -Receive: 1
  • Mensajes: 46
  • Debo aprender que nunca dejaré de aprender
Re:Creación de triggers en MySQL
« Respuesta #6 : noviembre 06, 2009, 10:19:39 am »
Si tenes acceso al servidor entonces te conviene mejor utilizar esta opción del gran MySQL:
5.2.3. The General Query Log


He estado revisando la documentación en línea y con estas sentecias he logrado visualizar las tablas de log:

SHOW CREATE TABLE mysql.general_log;
SHOW CREATE TABLE mysql.slow_log;

Luego para activar la escritura el logo supuestamente se ejecuta lo siguiete:

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';

Despues de eso ya puedo visualizar las tablas de log en la base de datos mysql, pero  no_no me registra las actividades de las tablas. :-/..algo más ha de faltar.

Desconectado vlad

  • Global Moderator
  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 104
  • Mensajes: 6366
    • Qualium.net
Re:Creación de triggers en MySQL
« Respuesta #7 : noviembre 06, 2009, 10:25:43 am »
Oh no, lo que pasa es que hay un detalle ahi:

Citar
#

Log entries have a standard format. To display the current structure of the log tables, use these statements:

SHOW CREATE TABLE mysql.general_log;
SHOW CREATE TABLE mysql.slow_log;

Esos comandos lo que muestran es la estructura de la tabla de registros (logs) pero no el contenido.
Para ver el contenido puedes usar el habitual "SELECT * FROM mysql.general_log;"

Desconectado better.jq

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 0
  • -Receive: 1
  • Mensajes: 46
  • Debo aprender que nunca dejaré de aprender
Re:Creación de triggers en MySQL
« Respuesta #8 : noviembre 06, 2009, 10:42:25 am »
me refiero a que sentido tiene una tabla donde solo se guarde.
yo esperaría saber que registro elimino y cosas como esas...

La verdad lo ideal sería almacenar en la bitácora dos registros por cada ejecución sobre una tabla:
Uno el antes: Para el caso de los update y delete
Otro despues: Para el caso de los insert, update y delete

Pero por ejemplo en SQL Server puedes obtener los datos de uno o varios registros en un string con la siguiente sintaxis:

SELECT IdUsuario, IdNivel, Nombres, Apellidos, IdDepartamento FROM dbo.Usuarios
where idusuario = 1  FOR XML RAW

y te devuelve un xml con los datos:

<row IdUsuario="1" IdNivel="2" Nombres="Usuario" Apellidos="Bodega" IdDepartamento="90" />

En este caso almacenaría este dato en la tabla de transacciones además del usuario, pc, etc.
antes y despues de una ejecución. Pero eso no he hayado como hacerlo en MySQL...

Desconectado better.jq

  • Trade Count: (0)
  • MiembrosReales
  • *
  • Thank You
  • -Given: 0
  • -Receive: 1
  • Mensajes: 46
  • Debo aprender que nunca dejaré de aprender
Re:Creación de triggers en MySQL
« Respuesta #9 : noviembre 06, 2009, 10:47:13 am »
Oh no, lo que pasa es que hay un detalle ahi:

Esos comandos lo que muestran es la estructura de la tabla de registros (logs) pero no el contenido.
Para ver el contenido puedes usar el habitual "SELECT * FROM mysql.general_log;"

Por eso pero al ver el conteido de la tabla no hay datos y he estado haciendo ejecuciones a la base, como que no estubiese activado  o encendido el log...