Friday 4 August 2017

SQL Server – Alter database in Single User mode to Multi User mode

Refereed from
https://myadventuresincoding.wordpress.com/2014/03/06/sql-server-alter-database-in-single-user-mode-to-multi-user-mode/

We have some test environment databases that get rebuilt nightly. The job that does the rebuild always switches the database into single user mode when it is being rebuilt. When the rebuild is finished it will switch it back to multi user mode. However, if there was a problem with a script and the job failed, it will leave the database in single user mode.
First, open a SQL Server Management Studio query window connected to database “master”.


The command to change the database back to multi user mode is:
ALTER DATABASE {InsertDatabaseNameHere} SET MULTI_USER WITH ROLLBACK IMMEDIATE GO


However, if there is an existing process blocking this alter, you may get the error message:
“Transaction (Process ID 864) was deadlocked on lock resources with another process and has been chosen as the deadlock victim”
Since both the existing running process and the current request have the same deadlock priority, preference is given to the longer running process which is why your alter database command is chosen as the deadlock victim. So to deal with this when you run the command again, set the deadlock priority to HIGH. However, if that does not work, you will need to kill the existing connection.
To find the “spid” of the existing connection, you can use the following query:
SELECT sd.[name], sp.spid, sp.login_time, sp.loginame
FROM sysprocesses sp
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid 
WHERE sd.[name] = 'DatabaseNameGoesHere'
As an alternative, you can also use the command “sp_who” to get the “spid” of the open connection:
exec sp_who
So, here is our revised command:
KILL SpidToKillGoesHere
GO
SET DEADLOCK_PRIORITY HIGH
GO
ALTER DATABASE DatabaseNameGoesHere SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
That should do it!