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

Respuesta
 
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
  #2  
Antiguo 10-05-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Usuario activo = Current_user o User

Si se puede asignar la un variable desde un trigger aunque no se que arias con el.

Creo que tu pregunta es si firebird Soporta variables Globales.
Y la respuesta es No.

Eso no es nungun problema. (Firebird soprta muchas).

Mira por lo que entendi tu lo que quieres es saber quien es el usuario actual pra saber que pude hacer en la bd.

Lo uso en todas las tablas.

Los siguentes campos

fecha y hora de creacion
fecha y hora de modificacion

id del usuario que creo //no requridos por quew pueden borrarse lo susuarios
id del usuario que modifico //igaual que le otro

En el programa cuando la persona se logea. verifico el uasuario y se existe me traigo su id y con eso hago las actualizaciones.

Pero seria perfecto que firebird te permitiera crear variables o simplemente tablas temporales como lo hace interbase 7.

Aunque creo que a firebird ya le van a agregar esta caracteristica. No se para la version 2.0
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #3  
Antiguo 11-05-2005
JaviP JaviP is offline
Registrado
 
Registrado: may 2005
Posts: 3
Poder: 0
JaviP Va por buen camino
Gracias muchas

Pues era mucho más fácil de lo que pensaba. La verdad es que estoy dando mis primeros pasos con bases de datos cliente servidor (siempre había utilizado Paradox y Access) y desconocía la existencia de la variable USER en Firebird. De todas formas el tema de las variables globales y tablas temporales me parece muy interesante y con muchas posibilidades, por eso me parece una buena noticia su futura implementación en Firebird.

No sabes cuánto te lo agradezco. ¡Y qué rapidez de respuesta!

Saludos
Responder Con Cita
  #4  
Antiguo 13-05-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
resp

Lo de las variables globales ya son un echo hace dos dias lo ley y las probe.

Firebird 2 incluye dos funciones rdb$getcontex, rdb$setcontex esto es una de las maravillas que le agregron a firebird 2.

Mira por ejemplo.

Si haces un procedimiento para logearse
... procedure ....
leer si existe el usuario y si existe registrarlo
rdb$setcontex('...seccion', 'Id usuario', '12');
...

Ya no tienes que estar enviando el usuario desde tu aplicacion para saver quien hizo que en cada registro.

Luego para saber el id

rdb$setcontex('...seccion', 'Id usuario');
si existe exa variable devolvera su valor si no sera nulo.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
Respuesta



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 01:51:01.


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