PDA

Ver la Versión Completa : Bloquear registro en edición o borrado


Soa Pelaez
05-01-2016, 02:29:31
Buen día quisiera poder bloquear un registro por cierto tiempo para un usuario en el momento que este editando un registro o borrándolo para que otro usuario del sistema no pueda realizar ninguna acción sobre este.

Si alguien tiene alguna idea sobre esto y pueda ayudarme se lo agradecería, gracias.

AgustinOrtu
05-01-2016, 04:48:22
Un registro? de los de la CPU? Un Record de Delphi?

Danos mas pistas :)

Reasen
05-01-2016, 05:30:45
No entiendo tu pregunta pero si te refieres al editor de registro del sistema y quieres evitar que un usuario edite el registro... Puedes detectar cuando el proceso regedit.exe se abra y cerrarlo.

ecfisa
05-01-2016, 08:00:54
Si, realmente el planteo es muy ambiguo.

Supongo que Soa Pelaez se debe referir a bloquear una determinada fila de una tabla... Y de ser así, mínimamente va a tener que especificar que gestor de base de datos y que componentes está utilizando para conectarse a él.

Saludos :)

Neftali [Germán.Estévez]
05-01-2016, 09:15:21
Al igual que a los demás me faltan datos para poder saber con certeza, de qué estamos hablando...

De todas formas, si estamos hablando de registros de Base de Datos, deberías revisar las transacciones.
Poderse hacer, se puede hacer, lo que no se si es adecuado...

¿Qué pasa si alguien se pone a editar y "en mitad" de la edición se va a otro programa o a tomar un café?

Casimiro Notevi
05-01-2016, 10:14:39
¿Bloquear? (http://www.intitec.com/varios/transacciones-0.2.6.pdf)

Soa Pelaez
05-01-2016, 16:58:28
Si me faltaron datos por especificar, cuando me refiero a bloquear los registros son en un aplicativo que estoy realizando multiusuario con el gestor de Base de Datos SQL Server.

Si alguien puede orientarme se lo agradecería.

Casimiro Notevi
05-01-2016, 17:04:59
... Base de Datos SQL Server ¿Con qué servidor de sql de bases de datos: MySql, PostgreSql, Firebird, Microsoft Sql, Oracle, Sqlite, etc. ?
¿Y para qué quieres bloquear registros?

Soa Pelaez
05-01-2016, 17:24:32
¿Con qué servidor de sql de bases de datos: MySql, PostgreSql, Firebird, Microsoft Sql, Oracle, Sqlite, etc. ?
¿Y para qué quieres bloquear registros?

El gestor de base de datos es SQL Server 2014, SQL Server Management Studio.
Necesito hacerlo para que un usuario1 no edite un registro que está siendo editado por otro usuario2 sino que al saber esto pueda enviarle un mensaje que esta siendo usado el registro.

Casimiro Notevi
05-01-2016, 17:28:51
El gestor de base de datos es SQL Server 2014, SQL Server Management Studio.. ¿Eso es microsoft, no?

Soa Pelaez
05-01-2016, 17:34:30
¿Eso es microsoft, no?

Si exacto. Y trabajo desde delphi con firedac.

TiammatMX
05-01-2016, 19:07:11
¿Y para qué quieres hacer explícitamente algo que el motor de bases de datos hace implícitamente? No necesitas "bloquearlo" por que los datos necesarios están en tu cliente y solamente deberías regresar los que cambiaron mediante un UPDATE...

MS SQLServer no es dBase o Paradox, los datos no están "vivos" en tu pantalla.

orodriguezca
05-01-2016, 19:52:58
Supongo que el proceso de edición de ese registro es algo demorado y con alta posibilidad de concurrencia, por eso el deseo de que otros usuarios no puedan editar el mismo registro simultáneamente. Aunque podemos delegar esta responsabilidad a la base de datos, que sabe hacerlo de forma natural, lo cierto es que solo al final, quizás después de haber editado un extenso formulario, obtendremos la excepción indicando que el registro está siendo utilizado por otro usuario, o peor aún, sobreescribiendo la información que otro usuario acaba de actualizar sin que nadie se entere.

Propongo la siguiente solución:

- Adicionar columnas a la tabla a editar que contengan: Estado de edición de registro (Editandose/Disponible), Usuario que está editando el registro y fecha-hora de inicio de la edición.

- a la consulta de selección se le añade el criterio para que solo lea los registros en estado Disponible.

- Cuando se empieza el proceso de Edición, se actualizan las nuevas columnas para indicar que ese registro se está "editando". La sentencia de actualización sería algo como

update tabla_a_Actualizar
set estadoRegistro='E', -- En Edición
fecha_inicio_edicion = current_timestamp,
Usuario_Edicion = @usuario
where ID_Registro = @id_registro
and estadoRegistro='D' -- Disponible

Si la Anterior sentencia de actualización actualiza cero filas entonces ese registro está siendo editado y se eleva la correspondiente excepción. Personalmente esto lo haría en un procedimiento almacenado.

- Finalmente cuando se actualiza realmente el registro con los nuevos datos se coloca la columna de EstadoRegistro en estado Disponible.

Otra posible solución sería crear una nueva tabla (tabla de registros en edición o de bloqueos) en donde se registre el nombre de la tabla, el ID de registro que se está editando y demás datos de auditoría. al finalizar el proceso se eliminaría el registro o se colocaría en un estado de terminado.