Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-05-2005
JaviP JaviP is offline
Registrado
 
Registrado: may 2005
Posts: 3
Poder: 0
JaviP Va por buen camino
¿Cómo obtener y manejar datos del usuario activo?

Estoy haciendo un programa de registro de documentos con Delphi y Firebird.
Cada base de datos contiene una tabla de ENTRADAS y otra de SALIDAS, además de otras complementarias, entre las que se encuentra una tabla usuarios donde están los datos de los operarios que pueden introducir datos en dicha base de datos, con un campo NOMBRE cuyo valor coincide con el "username" de la BD de cada usuario.
En las tablas de entradas y salidas existe un campo que identifica al usuario que introduce los datos. Este último campo debe llenarse automáticamente cada vez que se inserta o modifica un registro, no pudiéndose cumplimentar directamente por el usuario.
No tengo ningún problema para hacerlo desde la aplicación, pero si el usuario accede directamente a la BD, entonces podría insertar registros con la identificación de otro o cambiarlos sin que quede registrada su identidad.
Por eso se me ocurrió realizar la actualización de este campo por medio de procedimientos y triggers, de esta manera:

CREATE PROCEDURE PROC_IDENT_USR (NOMUSR CHAR (31))
RETURNS (
ID CHAR (9) CHARACTER SET ISO8859_1)
AS
BEGIN
SELECT IDENTIFICACION FROM USUARIOS WHERE NOM_USR = :NOMUSR INTO ID;
SUSPEND;
END

CREATE TRIGGER TRIG_IDENT_USR FOR ENTRADAS ACTIVE
BEFORE INSERT OR UPDATE POSITION 0
AS
declare variable NOMUSR CHAR(31);
declare variable IDUSR CHAR(9);
BEGIN
EXECUTE PROCEDURE PROC_IDENT_USR NOMUSR RETURNING_VALUES IDUSR;
NEW.ID_USUARIO = IDUSR;
END

La idea es que si el programa se está ejecutando, el parámetro NOMBRE del procedimiento lo tomo del componente database (utilizo FIBPlus) y si se accede directamente, éste será null, por lo que no es posible introducir o cambiar registros, porque el campo se ha diseñado como no nulo.
No hay ningún problema en pasar el parámetro NOMUSR al procedimiento, pero al ejecutarse este procedimiento dentro del trigger habría que asignar el valor del parámetro a una variable local dentro del trigger, cosa que no sé si es posible hacer desde la aplicación.

También se me ha ocurrido, y esto creo que sería lo más lógico, aunque no sé si lo más ortodoxo, crear, cada vez que se añada un usuario desde la aplicación, vistas de las tablas entradas y salidas seleccionando sólo aquellos registros cuyo ID_USUARIO sea igual al usuario activo añadiendo la cláusula WITH CHECK OPTION y, en la aplicación, utilizar la vista que corresponda dependiendo del usuario que haga login en la BD. Pero, claro, esto daría como resultado dos vistas por cada usuario que tenga acceso a cada tabla de ENTRADAS y SALIDAS.

Mis preguntas son las siguientes:

- ¿Se puede obtener desde el trigger el nombre del usuario activo? ¿Es posible asignar valor a una variable de un trigger programáticamente? ¿Tengo alguna posibilidad de poder utilizar el primer método descrito para conseguir lo que quiero?

- Aunque las vistas no contienen datos, si utilizo el segundo método (el único que he conseguido que funcione hasta el momento) ¿es conveniente tener un número de vistas en la BD que puede llegar a ser tan elevado?

Y, en fin, cualquier sugerencia que me podais aportar me será de gran ayuda.

Gracias.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:24:11.


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
Copyright 1996-2007 Club Delphi