PDA

Ver la Versión Completa : Aprendiendo a usar triggers en FB


Angel.Matilla
30-10-2015, 18:38:54
Reconozco que hasta ahora me había ido bien sin usar estos elementos pero también reconozco que después de leer mucho tienen una potencia tremenda y son muy útiles. Bien: Tengo esta tabla:
http://i98.photobucket.com/albums/l251/Angel_Matilla/Tabla_zpss0lvqwjm.jpg
en la que quiero crear un trigger que se ejecute antes de actualizarla de forma que si el campo Estado vale 1 rechace la transación y no permita continuar. Para ello creo que el código habría de ser este:
CREATE EXCEPTION Usuario_Conectado 'Usuario activo en otro terminal';

SET TERM ^ ;

CREATE TRIGGER USUARIOS_BU INTO Usuarios
ACTIVE BEFORE UPDATE
POSITION 0
AS
BEGIN
IF (OLD.Estado = 1)
EXCEPTION Usuario_Conectado;
END^

SET TERM ;^He estado probando con IBManager y en teoría se ejecuta bien:
http://i98.photobucket.com/albums/l251/Angel_Matilla/Ejecucioacuten_zpsmxkbe6fd.jpg
Pero una vez ejecutado aparentemente sin errores, si consulto las propiedades de la tabla me encuentro con esto:
http://i98.photobucket.com/albums/l251/Angel_Matilla/Propiedades_zpsu88noqox.jpg
¡No hay nimngún trigger creado! Pero si trato de ejecutar nuevamente el CREATE, IBManager (FB) me lanza un mensaje de error que me informa que Exception USUARIO_CONECTADO already exists. ¿Qué puedo estar haciendo mal?

Casimiro Notevi
30-10-2015, 18:46:41
IBManager ¿qué programa es?

Angel.Matilla
30-10-2015, 19:29:18
IBManager ¿qué programa es?
Perdón. Antes se llamaba así: SQL Manager Lite (http://www.sqlmanager.net/)

Casimiro Notevi
30-10-2015, 19:32:42
¿Soporta tu versión de firebird?
¿Has probado con ibexpert?

Angel.Matilla
30-10-2015, 19:33:54
¿Soporta tu versión de firebird?
¿Has probado con ibexpert?
Sí la soporta sin ningún problema. De todas formas probaré con IBExpert

Osorio
30-10-2015, 19:46:03
En realidad en las sentencias tienes dos cosas.

Primero tienes la creacion de la excepcion.
Luego tienes la creacion del trigger.

Al parecer la excepcion se creo sin problemas por lo que deberias eliminar la primera sentencia de CREATE EXCEPTION.

Y luego ejecuta solo la creacion del trigger.

Saludos.

Angel.Matilla
31-10-2015, 11:50:28
Gracias por las respuestas. Ya he decubierto que está pasando: En el CREATE TRIGGER hay dos errores de sintaxis.
Primero he puesto INTO Usuarios en vez FROM Usuarios.
Segundo me falta el THEN al final del IF.

Al margen de eso la sugerencia de Osorio de partir en dos el código ha funcionado a la perfección.

Casimiro Notevi
31-10-2015, 11:56:53
¿Y no muestra los mensajes de errores el manager que estás usando?

Angel.Matilla
31-10-2015, 12:31:09
Sí, pero es que con el código que puse ayer no da ningún mensaje de error. El problema creo que viene, como apunta Osorio, de tratar de hacerlo todo junto. No daba error porque la excepción si la crea y ahí termina; al hacer las dos cosas por separado en el CREATE TRIGGER sí me daba lo errores.

Casimiro Notevi
31-10-2015, 12:57:26
Normalmente los "manager" tienen dos posibilidades: ejecutar una sentencia sql (create, select, insert, etc.) o ejecutar un script de múltiples sentencias. En tu caso debías ejecutar la segunda posibilidad. Seguro que el manager que has usado tiene esa opción.

Angel.Matilla
31-10-2015, 13:03:55
Sí. Ya te digo que el error fue mio en el planteamiento.

MAXIUM
04-11-2015, 03:05:27
¿Como quedaría finalmente el código corregido?

Angel.Matilla
04-11-2015, 09:56:24
¿Como quedaría finalmente el código corregido?
Realmente es partirlo en dos: por un lado la definición de la excepción y por otro lado el trigger.
EXCEPCIÓN
CREATE EXCEPTION Usuario_conectado 'Usuario activo en otro terminal';
TRIGGER
SET TERM ^;

CREATE TRIGGER USUARIOS_BU FROM Usuarios
ACTIVE BEFORE UPDATE
POSITION 0
AS
BEGIN
IF (OLD.Estado = 1)
EXCEPTION Usuario_Conectado;
END^

SET TERM ;^