Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Aprendiendo a usar triggers en FB (https://www.clubdelphi.com/foros/showthread.php?t=89309)

Angel.Matilla 30-10-2015 18:38:54

Aprendiendo a usar triggers en FB
 
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:

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:
Código PHP:

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:

Pero una vez ejecutado aparentemente sin errores, si consulto las propiedades de la tabla me encuentro con esto:

¡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

Cita:

Empezado por Casimiro Notevi (Mensaje 498660)
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

Cita:

Empezado por Casimiro Notevi (Mensaje 498663)
¿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

Cita:

Empezado por MAXIUM (Mensaje 498825)
¿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
Código PHP:

CREATE EXCEPTION Usuario_conectado 'Usuario activo en otro terminal'


TRIGGER

Código PHP:

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 ;^ 



La franja horaria es GMT +2. Ahora son las 20:05:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi