Stored procedure per terminare tutte le connessioni al database o al server selezionato
introduzione
Ci possono essere momenti in cui è necessario disconnettere tutti gli utenti dal database, un esempio è per la replica di Log Shipping. Questo codice riportato di seguito è stato utilizzato su un server di report aggiornato ogni 20 minuti, poiché il database deve essere aperto in modalità esclusiva dall'attività di ripristino.
Il codice seguente accetterà un nome di database, quindi deve essere scritto una sola volta e memorizzato nel database master o utility (se ne hai creato uno). Può quindi essere richiamato da qualsiasi altro processo, nel nostro caso il piano di manutenzione completo nel documento sopra questo.
È una procedura memorizzata abbastanza semplice che ottiene semplicemente un elenco delle connessioni attive e scorre ognuna di esse uccidendo il processo e la connessione.
Codice SQL
CREATE PROC KillConnections(@database VARCHAR(50))AS BEGINSET NOCOUNT ON;DECLARE @spid INTDECLARE @killstatement NVARCHAR(10)--Declare a cursor to select the users connected to the specified databaseDECLARE c1 CURSOR FAST_FORWARD FOR SELECT request_session_id FROM sys.dm_tran_locksWHERE resource_type='DATABASE'AND(DB_NAME(resource_database_id)=@database OR @database IS NULL)OPEN c1FETCH c1 INTO @spidWHILE @@FETCH_STATUS=0 BEGIN IF @@SPID<>@spid--Don't kill the connection of the user executing this statement BEGIN -- Construct dynamic sql to kill spid SET @killstatement='KILL '+CAST(@spid AS VARCHAR(5)) EXEC sp_executesql @killstatement PRINT @spid-- Print killed spid END FETCH NEXT FROM c1 INTO @spidEND-- Clean upCLOSE c1DEALLOCATE c1ENDGO