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!