Bloquear registro en sql server

26/01/2006 - 04:25 por Juan Melas | Informe spam
Me piden en un sistema en capas bloquear un registro para que no pueda ser
accedido por otro usuario mientras esta siendo editado, hay alguna forma de
hacerlo?

Preguntas similare

Leer las respuestas

#6 Jesús López
28/01/2006 - 22:25 | Informe spam
Se me ha ocurrido algo mejor que es relativamente sencillo y muy robusto.

En SQL Server creamos una tabla como esta:

CREATE TABLE UsuariosActivos
(
NombreUsuario VARCHAR(100) PRIMARY KEY,
FechaHora DATETIME
)

GO

Y el siguente índice para optimizar el proceso:

CREATE INDEX UsuariosActivos_FechaHora ON UsuariosActivos(FechaHora)

El siguiente procedimiento almacenado:

CREATE PROCEDURE NotificarActividad
AS
UPDATE UsuariosActivos
SET FechaHora = GETDATE()
WHERE NombreUsuario = SUSER_SNAME()
IF @@ROWCOUNT = 0
INSERT INTO UsuariosActivos VALUES(SUSER_SNAME(), GETDATE())

Las aplicaciones cliente informan al servidor de base de datos de que están
activas ejecutando el procedimiento almacenado NotificarActividad cada 7
minutos. Esto lo podrían hacer fácilmente usando un timer en el formulario
principal de la aplicación.

Creamos también el siguiente procedimiento almacenado:

CREATE PROCEDURE EliminarBloqueosInactivos
AS
DECLARE @FechaHora DATETIME
BEGIN TRANSACTION
SET @FechaHora = DATEADD(mi, -15, GETDATE())
UPDATE C
SET CheckedBy = NULL
FROM Casos C JOIN UsuariosActivos U ON C.CheckedBy =
U.NombreUsuario
WHERE U.FechaHora < @FechaHora
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END
DELETE UsuariosActivos
WHERE FechaHora < @FechaHora
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END
COMMIT

Para que este procedimiento almacenado sea eficiente, debe existir un índice
sobre el campo Casos.CheckedBy.

Cada 15 minutos ejecutamos en el servidor el procedimiento almacenado
EliminarBloqueosInactivos que elimina todos los bloqueos de aquellos
usuarios que no han notificado actividad durante los últimos 15 minutos.
También elimina de la tabla usuarios activos a aquellos usuarios que no han
notificado actividad durante los últimos 15 minutos.

Así si una aplicación se queda colgada, o termina de forma anormal, o se
apaga el ordenador por corte de luz, los bloqueos permanen entre 15 y 30
minutos en el servidor después de la última notificación de actividad.

Lo más recomendable sería usar una tarea programada del agente de SQL Server
para ejecutar cada 15 minutos el procedimiento almacenado
EliminarBloqueosInactivos, esto puede hacerse fácilmente con el Enterprise
Manager. Para que esto funcione tiene que estar arrancado el agente de SQL
Server. En el Administrador de servicios de SQL Server, en el servidor,
debemos seleccionar "SQL Server Agent" de la lista "Servicios" y
asegurarnos de que está funcionando y que está activada la casilla de
verificación "Iniciar automáticamente con el SO". MSDE 2000 viene con el
agente de SQL Server, pero no viene con el Enterprise Manager. Sin embargo
se puede usar el Enterprise Manager desde cualquier ordenador de la red que
lo tenga instalado para configurar la tarea programada en MSDE 2000.

Otra alternativa sería usar el comando AT en el servidor o las tareas
programadas del panel de control, para que llamara a OSQL, una herramienta
de línea de comandos de SQL Server.que permite ejecutar instrucciones SQL y
scripts.


Saludos:

Jesús López
MVP
#7 Juan Melas
31/01/2006 - 03:35 | Informe spam
Muchas gracias Jesús en algo asi estaba pensando, voy a probarlo y te
consulto cualquier duda.

Gracias nuevamente por tu dedicación

"Jesús López" escribió en el mensaje
news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida