Conocer si una base de datos está en uso

31/05/2007 - 09:30 por José Luis Capel - Aicom | Informe spam
Hola,

Con mi lenguaje de programación (www.xailer.com) y mediante ADO quiero
lanzar un proceso de modificación de una base de datos. La base de datos
está en un SqlServer 2000.

Inicialmente necesitaría saber:

a. Si hay alguna otra conexión de usuario activa. Esto lo quiero saber para
poder bloquear con éxito la base de datos.

b. Si existe alguna forma de 'bloquear' toda la base de datos.

c. He visto dos formas de modificar la estructura de una tabla que ya
existe y tiene datos: la primera sería haciendo un drop de cada índice o
restricción, alterar la estructura y después volver a crear la restricciones
o claves. Y la segunda es crear una tabla temporal con la nueva estructura
y las restricciones y claves, volcar los datos de la tabla principal.
Borrar la tabla principal y renombrar la temporal por la principal. ¿Qué
ventajas supone la última respecto a la primera?

Saludos y gracias por vuestra gran ayuda.
José Luis Capel
 

Leer las respuestas

#1 Rubén Vigón
31/05/2007 - 11:00 | Informe spam
Hola José Luis,

a) Puedes usar los procedimientos almacenados «sp_who» y «sp_who2» para consultar los procesos y usuarios actuales de tu servidor y «KILL» para terminar alguno de ellos

sp_who
[...] Proporciona información acerca de los procesos y usuarios actuales de Microsoft® SQL ServerT. La información obtenida puede filtrarse para devolver únicamente los procesos que no estén inactivos

KILL
[...] Termina un proceso de usuario basado en el Id. de proceso del sistema (SPID) o unidad de trabajo (UOW). Si el SPID o UOW especificado tiene que deshacer mucho trabajo, puede que el comando KILL tarde cierto tiempo en completarse, especialmente cuando implique deshacer una transacción larga
[...] En Microsoft® SQL ServerT 2000, KILL puede utilizarse para terminar una conexión normal, que termina internamente las transacciones asociadas con el SPID especificado. Además, el comando puede utilizarse para terminar todas las transacciones distribuidas huérfanas si está en uso el Coordinador de transacciones distribuidas de Microsoft (MS DTC). Una transacción distribuida es huérfana cuando no está asociada a ningún SPID actual

b) Puedes poner la base de datos en modo monousuario o sólo-lectura con «sp_dboption» y "single user" ó "read only" respectivamente (o, si lo prefieres, con SET SINGLE_USER y SET READ_ONLY):

single user
[...] Con el valor TRUE, sólo puede tener acceso a la base de datos un usuario a la vez

read only
[...] Con el valor TRUE, los usuarios sólo pueden leer los datos de la base de datos y no modificarlos. No se puede utilizar la base de datos cuando se especifica un nuevo valor para la opción read only. La base de datos master representa una excepción, y sólo el administrador del sistema puede utilizar master aunque esté configurada la opción read only

SET READ_ONLY
[...] Cuando se especifica READ_ONLY, la base de datos está en modo de sólo lectura. Los usuarios pueden recuperar datos de la base de datos, pero no pueden modificarlos. Una base de datos de sólo lectura no permite realizar modificaciones en los datos

SET SINGLE_USER
[...] SINGLE_USER permite la conexión a la base de datos de un usuario cada vez. Todas las demás conexiones de usuario se desconectan. El intervalo de desconexión se controla mediante la cláusula de terminación de la instrucción ALTER DATABASE. Se rechazan nuevos intentos de conexión. La base de datos permanece en modo SINGLE_USER incluso si sale el usuario que estableció la opción. En este punto, un usuario distinto (pero sólo uno) puede conectarse a la base de datos

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
http://vigon.mvps.org

Preguntas similares