Como ya he comentado estoy tratando de enterarme como funcionan los triggers. Muchas cosas las entiendo a la perfección pero hay algo que se me escapa totalmente: ¿Cómo gestionar las excepciones? Seguro que en el foro ya hay algo pero no he sido capaz de encontrarlo.
Tengo definido este trigger:
Código SQL
[-]CREATE TRIGGER CONEXION_NEW FOR CONEXION
ACTIVE BEFORE INSERT
POSITION 1
AS
BEGIN
NEW.Id_Conexion = GEN_ID(ID_Conexion, 1);
WHEN GDSCODE unique_key_violation DO BEGIN
EXCEPTION USUARIO_CONECTADO;
END
END
y la excepción está definida así:
Código SQL
[-]CREATE EXCEPTION USUARIO_CONECTADO 'Este usuario está activo en otro terminal'
para esta tabla:
Código SQL
[-]CREATE TABLE CONEXION (
ID_CONEXION INTEGER NOT NULL,
NOMBRE VARCHAR(15) NOT NULL,
PUESTO VARCHAR(20),
HORA TIMESTAMP);
ALTER TABLE CONEXION ADD CONSTRAINT UQ_CONEXION UNIQUE (NOMBRE);
Tengo un módulo de gestión de errores (el código está simplificado):
Código PHP:
if (E->ClassNameIs("EIBInterBaseError")) // Si es una excepcion de interbase
{
EIBInterBaseError *ErrorIB = reinterpret_cast<EIBInterBaseError *>(E);
MenErr = StringReplace(ErrorIB->Message, "\n", " ", oReplace);
switch (ErrorIB->SQLCode) // Si realmente es de interbase tratamos el codigo de error
{
case -204:
[...]
break;
case -803:
break;
case -836:
[...]
return;
case -902:
[...]
break;
case -904:
[...]
return;
default:
[...]
break;
}
}
Sé que si trato de añadir un registro con un usuario que ya existe me va dar un error -803 y debería saltar la excepción. Lo que no acabo de comprender es cómo lograr que el programa me muestre el mensaje que he definido para esa excepción, ese
USUARIO_CONECTADO. ¿Alguien me lo puede explicar?