Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-08-2007
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Question Firebird control de accesos a tabla.

Hola llevo poco tiempo por el foro y no hago mas que preguntas asi que espero pronto empezar a dar respuestas.
Bueno la cuestion es que tengo una aplicacion multiusuario y me gustaria poder tener registrado que usuario hace alguna modificacion en alguna tabla. Los usuarios de la aplicacion estan en una tabla de Firebird y se validan al iniciar la aplicacion, pero no se si se podria almacenar el nombre de usuario en la entrada del registro de Windows de la aplicacion y utilizarla.
Gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 16-08-2007
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
existe un truco.. al menos en trucomania..llamado GetUserName que te permite obtener el nombre del usuario de windows... además, necesitarias la funcion para obtener el nombre del pc... almacenar la hora de inicio de secion en el sistema..

se que SQL Server almacena un registro como lo que quieres.. pero no se si Firebird.. lo tendra
__________________
BlueSteel
Responder Con Cita
  #3  
Antiguo 16-08-2007
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
bueno.. no pude editar el mensaje anterio.. se quedo medio pegado el asunto...

era pa' decirte que es una funcion.. y es así

Código Delphi [-]
Function GetUserName:String;
Var
   PcUser  : PChar;
   DwUsize : DWord;
Begin
   DwUsize := 21;
   GetMem( PcUser, DwUsize);
   Try
      If Windows.GetUserName( PcUser, DwUsize ) then
         Result := PcUser
   Finally
      FreeMem( PcUser );
   End;
End
__________________
BlueSteel
Responder Con Cita
  #4  
Antiguo 17-08-2007
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Gracias por la rapida respuesta Bluesteel, pero el getusername ya lo vi y no me sirve ya que lo que quiero registrar es el usuario de la aplicacion activo en este momento no el de windows.
Saludos
Responder Con Cita
  #5  
Antiguo 17-08-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por sandiamo Ver Mensaje
...ya que lo que quiero registrar es el usuario de la aplicacion activo en este momento no el de windows.
¿Has comentado que los usuarios se validan al entrar en la aplicación, no? Entonces porqué no usas ese usuario para guardar un LOG de modificaciones.
Cuando hagas una modificación, además insertas en una tabla de LOG quien ha hecho la operación.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 17-08-2007
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Disculpa mi torpeza pero existe algun hilo relativo a este tema de la tabla de log. La aplicacion se ejecuta en red y pueden haber accesos simultaneos a la tabla del servidor por eso aunque se validan los usuarios al entrar necesito saber cual es el usuario activo en cada caso, por eso habia pensado en guardar el nombre de usuario en algun tipo de variable global.
Gracias y disculpa estoy empezando con esto de Delphi.
Responder Con Cita
  #7  
Antiguo 17-08-2007
mamaro mamaro is offline
Miembro
 
Registrado: mar 2004
Posts: 79
Poder: 21
mamaro Va por buen camino
Hola

Lo que el compañero te está diciendo es que crees una tabla en la que almacenes los datos que necesites (Nombre de usuario, fecha, etc), y pongas un disparador a la(s) tabla(s) que realicen la inserción en esa tabla, ejemplo:

Tabla Log
Fecha Timestamp
Usuario Varchar(8)
etc ...

Tabla Cliente
Identificador integer
Nombre varchar(30)
Dirección varchar(50)
etc ...

Disparador
Código SQL [-]
Create Trigger REGISTRA_LOG for CLIENTE
active after insert or update or delete
position 0
as
begin
  insert into Log (fecha,usuario)
  values (current_timestamp,current_user);
end

La versión nueva de Firebird (creo que la 2.1) permite además de disparar eventos al realizar acciones sobre tablas, dispara eventos al loguearse un usuario, al hacer commit, etc.

Saludos
Responder Con Cita
  #8  
Antiguo 17-08-2007
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
El problema es que yo los datos que quiero almacenar no es el current_user ya que este es el usuario de windows sino el usuario de la aplicacion y deseo cojer tambien el valor de algunos campos del registro modificado para poder hacer consultas posteriores sobre ellos. Habia pensado en usar un procedimiento almacenado y dispararlo en el evento onnewrecord o alguno parecido del IBDataset.
Responder Con Cita
  #9  
Antiguo 17-08-2007
mamaro mamaro is offline
Miembro
 
Registrado: mar 2004
Posts: 79
Poder: 21
mamaro Va por buen camino
hola

current_user te da el usuario logueado en la base de datos no el de windows.

Acordate que en los disparadores contás con las variables "new" y "old" para acceder a los valores de los campos (valores actuales y viejos)
Responder Con Cita
  #10  
Antiguo 20-08-2007
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
Perdona tienes razon, current _user me da el usuario de la base de datos pero tampoco me vale ya que en la base de datos entro siempre con el usuario por defecto SYSDBA.
Responder Con Cita
  #11  
Antiguo 20-08-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por sandiamo Ver Mensaje
Hola llevo poco tiempo por el foro y no hago mas que preguntas asi que espero pronto empezar a dar respuestas.
Bueno la cuestion es que tengo una aplicacion multiusuario y me gustaria poder tener registrado que usuario hace alguna modificacion en alguna tabla. Los usuarios de la aplicacion estan en una tabla de Firebird y se validan al iniciar la aplicacion, pero no se si se podria almacenar el nombre de usuario en la entrada del registro de Windows de la aplicacion y utilizarla.
Gracias anticipadas.
Cita:
Empezado por mamaro Ver Mensaje
Lo que el compañero te está diciendo es que crees una tabla en la que almacenes los datos que necesites (Nombre de usuario, fecha, etc), y pongas un disparador a la(s) tabla(s) que realicen la inserción en esa tabla, ejemplo:

Tabla Log
Fecha Timestamp
Usuario Varchar(8)
etc ...

Tabla Cliente
Identificador integer
Nombre varchar(30)
Dirección varchar(50)
etc ...

Disparador
Código SQL [-]Create Trigger REGISTRA_LOG for CLIENTE
active after insert or update or delete position 0
as begin insert into Log (fecha,usuario)
values (current_timestamp,current_user);
end


La versión nueva de Firebird (creo que la 2.1) permite además de disparar eventos al realizar acciones sobre tablas, dispara eventos al loguearse un usuario, al hacer commit, etc.

Saludos
Cita:
Empezado por sandiamo Ver Mensaje
Perdona tienes razon, current _user me da el usuario de la base de datos pero tampoco me vale ya que en la base de datos entro siempre con el usuario por defecto SYSDBA.
Yo no termino de comprenderte... Si ya tienes registrado el nombre de usuario en alguna tabla y si sabes que al momento de entrar al sistema es porque sabes y tienes referencia al usuario. Entonces... cual es tu duda: ¿De donde quieres obtener el nombre de usuario? ¿Para que quieres capturar el nombre de usuario de windows si ya lo tienes en la base de datos?¿Son los mismos?
Me he mareado al intentar entenderte... no termino de comprender...

Y si capturas el nombre mediante el uso de la api de windows como te comentan... y/o que uses current_user igualmente tienes en alguna variable o propiedad dicho nombre...

Y como dijo mamaro... la solución pasa por allí: tiggers/procedimientos almacenados. Independientemente de donde captures el nombre de usuario, debes lanzar ya sea un tigger, un procedimiento almacenado... tu ves...

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 20-08-2007 a las 09:40:02.
Responder Con Cita
  #12  
Antiguo 20-08-2007
sandiamo sandiamo is offline
Miembro
 
Registrado: mar 2007
Posts: 22
Poder: 0
sandiamo Va por buen camino
En efecto tengo registrado al usuario en una tabla y una vez se valida quiero que cualquier modificacion que haga en cualquier tabla quede reflejada en una tabla de Log con el nombre de la tabla, la fecha, la hora y una serie de observaciones. Para ello lo que hago es pasar la variable global donde almaceno el nombre de usuario a las DLL que contienen el resto de procedimientos que manejan tablas dentro de la aplicacion y asi usarlo en cada momento que hago una modificacion de una tabla llamando a un procedimiento almacenado que realiza el mantenimiento de la tabla de Log. Lo que queria saber es si se puede guardar ese nombre de usuario en alguna variable global a la aplicacion estilo current_user para accediendo a ella evitarse todo esto.
Gracias y disculpen si me he explicado mal.
Responder Con Cita
  #13  
Antiguo 20-08-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por sandiamo Ver Mensaje
En efecto tengo registrado al usuario en una tabla y una vez se valida quiero que cualquier modificacion que haga en cualquier tabla quede reflejada en una tabla de Log con el nombre de la tabla, la fecha, la hora y una serie de observaciones. Para ello lo que hago es pasar la variable global donde almaceno el nombre de usuario a las DLL que contienen el resto de procedimientos que manejan tablas dentro de la aplicacion y asi usarlo en cada momento que hago una modificacion de una tabla llamando a un procedimiento almacenado que realiza el mantenimiento de la tabla de Log. Lo que queria saber es si se puede guardar ese nombre de usuario en alguna variable global a la aplicacion estilo current_user para accediendo a ella evitarse todo esto.
Gracias y disculpen si me he explicado mal.
A ver si se comprendí.
¿Entonces tu ya tenías hecho tal como te lo comentabamos?
Yo no se si habrá otra manera de hacerse sin usar triggers/SP. Creo que no hay forma de evitarse lo de disparar tiggers... o SP... Me suena lógico trabajar así.
Es útil trabajar de ese modo... al menos para mi resulta cómodo emplear tiggers/SP... no estoy en tu lugar como para decir que es lo que no te gusta de trabajar de esa forma. Pues, como dices: "evitarse todo esto".

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
accesos al disco duro YolandaM Windows 2 11-07-2007 14:18:46
Problema con accesos telefonicos fox Varios 0 05-03-2007 16:21:26
Control Errores en Firebird joanajj Firebird e Interbase 3 01-06-2006 20:38:29
aplicaciones para tener un completo control de firebird 1.5 ale21alito Conexión con bases de datos 2 02-04-2005 22:55:52
Control de cambios en Firebird repo Firebird e Interbase 0 04-10-2004 22:20:57


La franja horaria es GMT +2. Ahora son las 04:34:18.


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