sábado, 1 de febrero de 2020

SQL SERVER - Base de datos ya esta abierta y solo puede tener un usuario a la vez

En algunas ocasiones nos encontramos con un error que nos indica que una base de datos ya esta abierta y solo puede tener un usuario al mismo tiempo, esto se debe a que la base de datos fue configurada para ser Single User, el proceso puede parecer muy sencillo, simplemente cerrar la sesión del usuario que tiene abierta la base de datos, pero esto no siempre es así, hay procesos, como algunos jobs, índices u otros procesos que nos hará complicada la tarea, para eso tenemos este ejemplo:



1. Vamos a crear nuestra base de datos de prueba


CREATE DATABASE PRUEBAS
GO

2. Creamos una tabla simplemente como prueba


CREATE TABLE EMPLEADOS (
ID INT PRIMARY KEY IDENTITY,
NUMEROEMPLEADO INT,
NOMBRES VARCHAR(200),
APELLIDOP VARCHAR(100),
APELLIDOM VARCHAR(100),
RFC VARCHAR(20)).


3. Configuramos la base de datos en modo Usuario único o single user mediante la siguiente instrucción.


ALTER DATABASE PRUEBAS SET SINGLE_USER
GO

4. Llenamos la tabla con algún dato de prueba mediante una transacción, pero para el ejemplo, no completaremos la transacción y la dejaremos a medias

begin tran
INSERT INTO EMPLEADOS (
NUMEROEMPLEADO, NOMBRES, APELLIDOP, APELLIDOM, RFC) VALUES
(5965, 'LUIS EMMANUEL', 'URIAS', 'ROBLES', 'UIRL8509046P8')





5. Ahora en otra ventana intentaremos utilizar esa base de datos y obtendremos un error como el siguiente:


use PRUEBAS
go
 









Msg 924, Level 14, State 1, Line 1
Database 'PRUEBAS' is already open and can only have one user at a time.


Eso se debe a que no podemos tener mas de una sesión abierta de esa base de datos por haberla establecido como usuario único, lo más sencillo sería cerrar la otra ventana para liberar la base, pero no tendría sentido este post, lo que nos interesa es saber, que proceso y que máquina está bloqueando la base, y para eso utilizaremos las vistas del sistema.

6. Primero tenemos que saber que ID tiene nuestra base de datos a la cual queremos acceder, y para eso utilizaremos la siguiente sentencia:

select * from sys.databases
 


Como podemos observar nuestra base de datos tiene el ID 5, con esos datos ya podemos proceder con el siguiente comando:


select * from sys.sysprocesses where dbid = 5



  7. Nos encontramos conque el proceso numero 7 es quien tiene ocupada esa base de datos, ahora podemos ir mas allá de esa información y averiguar que usuario y que equipo están bloqueando y eso lo haremos mediante el siguiente comando:


exec sp_who2 57




En esta imagen podemos apreciar quien es el usuario y el equipo que esta bloqueando, ahora solo bastaría con "matar" a ese proceso, y esto lo haremos mediante el comando:


kill 57
go

Una vez muerto el proceso, podremos abrir la base de datos en otra sesión, y en esta ocasión ponerla como multi usuario:


use PRUEBAS
go

ALTER DATABASE PRUEBAS SET MULTI_USER
GO


Hasta aquí el post, espero sea de su agrado y utilidad, si tienen alguna duda, que no les de pena preguntar. Espero compartan, comenten, o den clic en algún anuncio que les interese.

Muchas gracias 



No hay comentarios.:

Publicar un comentario

mensaje 'El administrador de transacción ha deshabilitado su soporte para transacciones de red o remotas.'

Cuando agregamos un servidor vinculado, mejor conocido como linked server, es importante configurarlo de manera correcta, como por ejemplo,...