Heute ging mir beim Restore eines MSSQL Servers ein Client auf die Nerven. Nachdem ich alle Benutzer gebeten habe, wegen eben der Rücksicherung einer Datenbank entsprechende Anwendungen zu beenden, war noch immer jemand auf der Datenbank. Doch wer? Ein Blick in die System-Prozesse zeigt den entsprechenden User:
select spid, status, loginame, hostname, blocked, db_name(dbid), cmd from master..sysprocesses
Da ich keine Lust hatte, mit dem entsprechenden User zu diskutieren, wieso er jetzt nicht die Sache beenden konnte, entschied ich mich für die radikale Methode und den entsprechenden Prozess abzuschießen. Der Benutzer würde sich schon im Falle des Falles bei mir melden.
Ein SQL Script sucht mir die Prozesse die auf die entsprechende Datenbank zugreifen und killt diese:
-- use the master database
USE master
go
DECLARE @DatabaseName varchar(30),
@ServerProcessID varchar(10),
@StartTime datetime
-- Set our database name to my_database (change this to your db)
SELECT @StartTime = current_timestamp,
@DatabaseName = 'my_database'
-- Timeout after 3 minutes
while(exists(Select * FROM sysprocesses
WHERE dbid = db_id(@DatabaseName)) AND
datediff(mi, @StartTime, current_timestamp) < 3)
begin
DECLARE spids CURSOR FOR
SELECT convert(varchar, spid) FROM sysprocesses
WHERE dbid = db_id(@DatabaseName)
OPEN spids
while(1=1)
BEGIN
FETCH spids INTO @ServerProcessID
IF @@fetch_status < 0 BREAK
exec('kill ' + @ServerProcessID)
END
DEALLOCATE spids
end
Danach klappte der Restore problemlos und prompt meldete sich auch der entsprechende Benutzer per Telefon zu Wort. Ich nahm den Hörer zur Hand und meldete mich zuckersüß mit den Worten "Simon, Operator hier?"...