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

Problema con trigger

Estas en el tema de Problema con trigger en el foro de Mysql en Foros del Web. Hola, estoy teniendo un problema con la sintaxis de un trigger. Lo que quiero que haga el trigger es que evite una insercion si se ...
  #1 (permalink)  
Antiguo 12/05/2008, 02:08
 
Fecha de Ingreso: agosto-2006
Mensajes: 15
Antigüedad: 17 años, 8 meses
Puntos: 0
Problema con trigger

Hola,
estoy teniendo un problema con la sintaxis de un trigger. Lo que quiero que haga el trigger es que evite una insercion si se dan una serie de condiciones. Os pego lo que intento poner, a ver si es un error tonto o si se m ha olvidado ya lo q aprendi en la carrera :p

CREATE TRIGGER assign BEFORE INSERT ON belongs_to as
if (select count(*) from belongs_to where id_user=NEW.id_user and id_module=NEW.id_module and id_ir=NEW.id_ir and date_finsih=null) > 0
begin
print "Ya existe esa asignacion"
rollback transaction
end;

Gracias
  #2 (permalink)  
Antiguo 12/05/2008, 04:49
 
Fecha de Ingreso: abril-2008
Mensajes: 58
Antigüedad: 16 años
Puntos: 1
Re: Problema con trigger

prueba a poner : "create or replace trigger..."
  #3 (permalink)  
Antiguo 12/05/2008, 05: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
Re: Problema con trigger

Verifica que no exista ya otro trigger definido para ese evento en esa tabla.
Por definición, no pueden existir dos trigger distintos definidos para, por ejemplo, ON UPDATE. La razón es simple: Por un lado, si ambas cosas se hacen en el mismo caso, ¿por qué no las pones juntas? Por otro lado, eso evita que se realicen cosas opuestas y contradictorias en el mismo evento (escribir y borrar el mismo dato, por ejemplo).

Finalmente. SIEMPRE, antes de definir un trigger, function o procedure, hay que indicar:
Código:
DROP TRIGGER IF EXISTS nombreDelTrigger;

o para funciones: 

DROP FUNCTION IF EXISTS nombreDeLaFuncion;

o en procedimientos: 

DROP PROCEDURE IF EXISTS nombreDelProcedimiento;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 12/05/2008, 05:33
 
Fecha de Ingreso: agosto-2006
Mensajes: 15
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: Problema con trigger

gracias por contestar, pero no es problema de que ya exista trigger porque no existe ningun trigger en la base de datos. aparece como error de sintaxis, pero no encuentro donde
  #5 (permalink)  
Antiguo 12/05/2008, 08:30
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
Re: Problema con trigger

El BEGIN es el inicio del cuerpo de un procedimiento, sea TRIGGER, FUNCTION o PROCEDURE. Eso quiere decir que TODAS las sentencias deben ir DENTRO de esa sección.
[code]

CREATE TRIGGER assign BEFORE INSERT ON belongs_to AS
BEGIN
IF
(SELECT COUNT(*)
FROM belongs_to
WHERE id_user=NEW.id_user
AND id_module=NEW.id_module
AND id_ir=NEW.id_ir
AND date_finsih=null) > 0
/*Esta funcion no existe. El SQL no es un lenguaje de programación */
print "Ya existe esa asignacion"
/* No puedes deshacer una transacción en un trigger. No se inicia en él. */
ROLLBACK TRANSACTION;
END ;

Hay algunos errores conceptuales:
- Un trigger sirve para realizar operaciones ante determinados eventos, pero no para interrumpirlos. Un trigger te permite hacer validaciones, pero el proceso del evento no se interrumpe. Solamente manipulas los datos y/o generas otros en otra tabla.
- Las validaciones que estás intentando se deben hacer ANTES de enviar los datos a la tabla.
- Las validaciones de ese tipo no requieren estos procesos. Se pueden controlar con los índices UNIQUE de claves por múltiples campos.
- Las validaciones de NOT NULL, se pueden controlar en la definición de la tabla.
- Fíjate bien en las sentencias de SQL. No pongas lo que no pertenece al SQL. Te dará error de sintaxis.
__________________
¿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 12/05/2008, 09:39
 
Fecha de Ingreso: agosto-2006
Mensajes: 15
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: Problema con trigger

no se puede evitar que se realice una insercion desde un trigger??
lo he intentado hacer usando UNIQUE, pero al ser uno de lo campos nulo no funciona bien

Gracias

Última edición por moroborracho; 12/05/2008 a las 09:45
  #7 (permalink)  
Antiguo 12/05/2008, 12:07
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
Re: Problema con trigger

Tienes que validar las cosas en la aplicación, sino, ¿qué sentido tiene enviarle a la base información que no podrá almacenar?
Uno de los tips centrales de todo método de optimización de bases de datos es recordarles a los programadores de las aplicaciones que la base de datos no tiene que hacer TODO el trabajo. Su función central es almacenar datos y responder consultas. Las validaciones de datos son asunto de las aplicaciones; en todo caso, antes de hacer una inserción deberías hacer una consulta de valiudación del tipo:
Código:
SELECT IF(COUNT(*) IS NULL, 0, COUNT(*)) 
FROM belongs_to
WHERE id_user=NEW.id_user
AND id_module=NEW.id_module
AND id_ir=NEW.id_ir
AND date_finsih=null) > 0;
esto te devolvería un valor cero (0) o mayor a cero y si te da cero mandás el INSERT,.
__________________
¿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 03:34.