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

Duda rapida de disparador

Estas en el tema de Duda rapida de disparador en el foro de Mysql en Foros del Web. Pues nada es simple, quiero iniciarme en la creación de disparadores o TRIGGERs en mysql y tengo unos problemillas de novato, me he leido tutoriales ...
  #1 (permalink)  
Antiguo 28/11/2008, 03:44
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 4 meses
Puntos: 1
Duda rapida de disparador

Pues nada es simple, quiero iniciarme en la creación de disparadores o TRIGGERs en mysql y tengo unos problemillas de novato, me he leido tutoriales y tal para aprender a crealos y tal pero cuando lo meto, no reconoce el código y he visto que use un manual de mysql 5.0 y yo tengo la version 4.1.1. He buscado y he leido esta frase:

Note: Antes de MySQL 5.0.10, los disparadores no podían contener referencias directas a tablas por su nombre. A partir de MySQL 5.0.10, se pueden escribir disparadores como el llamado testref, que se muestra en este ejemplo...

No se a que se refiere con referencias directas, si se eso seguro que sere capaz de crearlas, he aquí mi primer TRIGGER:

CREATE TABLE origen (
id_origen int auto_increment,
contenido_origen char(34),
PRIMARY KEY(id_origen)
);

CREATE TABLE copia (
id_copia int auto_increment,
contenido_copia char(34),
PRIMARY KEY(id_copia)
);

DELIMITER |
CREATE TRIGGER email BEFORES INSERT
ON
origen
FOR EACH ROW BEGIN
INSERT INTO copia VALUES(OLD.id_origen,OLD.contenido_origen);
END
| DELIMITER

Solo es preguntar a que se refiere a esa frase, bueno si poneis un ejemplo con mi código poes mejor gracias ^^
  #2 (permalink)  
Antiguo 28/11/2008, 04:13
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: Duda rapida de disparador

En MySQL 4.1 no existen TRIGGERS, estos fueron implementados desde la versión 5.
O Cambias de versión o te olvidas de los TRIGGERS.
__________________
¿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 28/11/2008, 04:23
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Duda rapida de disparador

Gracias eso es lo que yo qería saber, entonces me despido, pueso no puedo actualizar mi mysql ^^ asias :D
  #4 (permalink)  
Antiguo 01/12/2008, 03:01
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 4 meses
Puntos: 1
De acuerdo Respuesta: Duda rapida de disparador

Bueno ya he conseguido actualizar a mysql 5 y es verdad era eso pero ahora tengo un problema que no entiendo:
Tengo esto:

CREATE TABLE origen (
id_origen int auto_increment,
contenido_origen char(34),
PRIMARY KEY(id_origen)
);

CREATE TABLE copia (
id_copia int auto_increment,
contenido_copia char (34),
PRIMARY KEY(id_copia)
);

DELIMITER |
CREATE TRIGGER capturaemail BEFORE INSERT ON origen
FOR EACH ROW BEGIN
INSERT INTO copia VALUES(contenido_origen);
END;
| DELIMITER ;

Y me sale este error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
| DELIMITER' at line 4


He buscado manuales y tal, pero no entiendo porque me da error de sintaxis si al menos eso creo yo que la sintaxix está bien, perdonen mi ignorancia pero soy nuevo en esto :(, gracias.

Lo que quiero es crear un disparador que me copie las direcciones de emails de una tabla ORIGEN a una tabla COPIA.
  #5 (permalink)  
Antiguo 01/12/2008, 04:24
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: Duda rapida de disparador

1. Si vas a insertar el valor de un sólo campo en una tabla que tenga más de uno, debes definirlo en el INSERT. No importa que el otro campo en este caso sea un auto_increment. aún así debes hacerlo.
2. Cuando manipulas datos recibidos dentro de un TRIGGER debes usar las pseudovariables NEW y OLD..
3. No uses el OR (|) para crear el DELIMITER, puede tener efectos no deseados si usas ese mismo signo dentro del cuerpo, lo que eventualmente puede suceder. Es preferible usar un doble signo, como por ejemlpo $$ (es el más usado).
4. El END del cuerpo no requiere de fiun de línea (;) sino de fin de cuerpo, que es el mismo delimitador que pusiste al inicio.
El ejemplo quedaría, entonces:
Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE TRIGGER capturaemail BEFORE INSERT ON origen
  3. FOR EACH ROW BEGIN
  4. INSERT INTO(copiacontenido_copia) VALUES(contenido_origen);
  5. END $$
  6. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 01/12/2008, 04:33
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Duda rapida de disparador

INSERT INTO(copiacontenido_copia) VALUES(contenido_origen);

¿No sería, así?.

INSERT INTO copia (contenido_copia) VALUES(contenido_origen);


No sabía que en disparador había que especificar lo campos.
  #7 (permalink)  
Antiguo 01/12/2008, 04:41
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Duda rapida de disparador

DELIMITER $$
CREATE TRIGGER capturaemail BEFORE INSERT ON origen
FOR EACH ROW BEGIN
INSERT INTO copia (contenido_copia) VALUES(contenido_origen);
END $$
DELIMITER ;

Y ahora según esto no tengo privilegios:

#1227 - Access denied; you need the SUPER privilege for this operation

Tendre que contactar con los admins del server, ¿no?
  #8 (permalink)  
Antiguo 01/12/2008, 06:41
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: Duda rapida de disparador

Yes. Por lo demás, me olvidé yo mismo de un detalle:
Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE TRIGGER capturaemail BEFORE INSERT ON origen
  3. FOR EACH ROW BEGIN
  4. INSERT INTO copia(copiacontenido_copia) VALUES(NEW.contenido_origen);
  5. END $$
  6. DELIMITER ;

Atención con el NEW., Eso determina que lo que tiene que tomar es el valor del campo que está entrando. SI no lo pones puede que haya resultados erráticos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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:06.