Ver Mensaje Individual
  #1  
Antiguo 22-04-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
Evitar que un usuario se conecte más de una vez

A partir del código que he encontrado en un blog estoy tratando de implementar esa funcionalidad en mi base de datos FB. Tengo esta tabla en la base de datos:
Código:
CREATE TABLE Conexion (Id_Servidor INTEGER NOT NULL, Nombre VARCHAR(15) NOT NULL, Hora TIMESTAMP,
CONSTRAINT UQ_Conexion UNIQUE (Nombre))
y del blog que decía antes he adaptado dos triggers de la base de datos:
Código:
CREATE TRIGGER CONECTADO
ACTIVE ON 
  CONNECT
POSITION 0
AS
BEGIN
  DELETE FROM Conexion WHERE Id_Servidor NOT IN (SELECT MON$ATTACHMENT_ID FROM MON$ATTACHMENTS);

  INSERT INTO Conexion (Id_Servidor, Nombre, Hora) VALUES (CURRENT_CONNECTION, CURRENT_USER, CURRENT_TIMESTAMP);
END
Código:
CREATE TRIGGER DESCONECTADO
ACTIVE ON 
  DISCONNECT
POSITION 1
AS
BEGIN
  DELETE FROM Conexion WHERE Nombre = CURRENT_USER;
END
En teoría con el primero de ellos primero se borran todas las conexiones que no están activas (por ejemplo si se ha apagado el servidor a lo bruto) y luego se inserta un registro en la tabla que he puesto arriba. Dado que hay un índice único con el nombre del usaurio, si está conectado debe saltar un error. El segundo disparador debería borrar la conexión cuando se sale de la aplicación correctamente.

Sin embargo algo debo estar haciendo mal y no sé que es. Si lanzo aplicación me pide el usuario y clave de acceso y la aplicación se lanza bien. Salgo de la misma de forma correcta y me voy a EMS SQL Manager y abro la base de datos con sysdba / masterkey.

Y aquí viene el problema: Si trato de ver el contenido de cualquier tabla o simplemente abrir el panel para escribir un query me da un error que intuyo genera el primero de los dos triggers.
Cita:
Can't format message 13:197 -- message file C:\Windows\firebird.msg not found.
Violation of PRIMARY or UNIQUE KEY constraint "UQ_CONEXION" on table "CONEXION".
Problematic key value is ("NOMBRE" = 'SYSDBA').
At trigger 'CONECTADO' line: 5, col: 3.

SQL Code: -803
IB Error Number: 335544665
Si ya estoy conectado, porque estoy viendo el árbol de la base de datos, y trato de abrir una tabla ¿por qué me da ese error? ¿No se supone que ese trigger sólo se ejecuta al conectarse a la base de datos?
Responder Con Cita