ASESINAR TODOS LOS PROCESOS ASOCIADOS A UNA BASE DE DATOS SQL SERVE

Link:http://geeks.ms/blogs/elbruno/archive/2007/02/08/asesinar-todos-los-procesos-asociados-a-una-base-de-datos-sql-server.aspx

ueden hacer una búsqueda en Live Search, lo transcribo y lo dejo en el oficial. He aquí el plagio a mi mismo.

------------------------------------------------------------------

Everyday hay un pequeño problema que nos da satisfacciones cuando lo podemos solucionar, el del dia de ayer, estuvo centrado en la creación dinámica de bases de datos sin utilizar ISQL y Sql scripts. Una solución fue usar SqlCommand, y ejecutar un script para el DROP y el CREATE de la Base de datos



1 DROP DATABASE MyDBPrueba
2 CREATE DATABASE MyDBPrueba
Sin embargo, uno de los problemas que tiene la ejecución de este script se da cuando hay algún usuario conectado a la Base de Datos; en este caso no se puede DROPPEAR la misma.

La solución a este problema puede ser este SQL script que elimina todos los procesos asociados a una base de datos.



1 USE master;
2 DECLARE curkillproc
3 CURSOR FOR SELECT
4 spid,dbs.name AS dbname
5 FROM
6 master..sysprocesses pro,
7 master..sysdatabases dbs
8 WHERE
9 pro.dbid = dbs.dbid AND
10 dbs.name = 'MyDBPrueba'
11 FOR READ ONLY
12
13 DECLARE @varspid AS integer
14 DECLARE @vardbname AS varchar(256)
15 DECLARE @numUsers AS integer
16
17 SET @numUsers = 0
18 OPEN curkillproc
19 FETCH NEXT FROM
20 curkillproc
21 INTO @varspid, @vardbname
22 WHILE @@fetch_status = 0
23 BEGIN
24 EXEC('kill ' + @varspid)
25 SET @numUsers = @numUsers + 1
26 FETCH NEXT FROM curkillproc
27 INTO @varspid, @vardbname
28 END
29 CLOSE curkillproc
30 DEALLOCATE curkillproc
31 SELECT @numUsers as NumUsersDisconnected
Si lo traducimos a una function C#, puede quedar de la siguiente manera

///
/// Disconnects the users from data base.
///

/// The SQL connection.
/// Name of the database.
/// The command timeout.
/// The number of users disconected.
private int DisconnectUsers(SqlConnection sqlConnection, string databaseName, int commandTimeout)
{
string query = string.Format(CultureInfo.InvariantCulture, "USE master; \r\nDECLARE curkillproc \r\nCURSOR FOR SELECT \r\n spid,dbs.name AS dbname \r\n FROM \r\nmaster..sysprocesses pro, \r\n master..sysdatabases dbs \r\n WHERE \r\n pro.dbid = dbs.dbid AND \r\n dbs.name = '{0}' \r\n FOR READ ONLY \r\n \r\n DECLARE @varspid AS integer \r\n DECLARE @vardbname AS varchar(256) \r\n DECLARE @numUsers AS integer \r\nSET @numUsers = 0 \r\n OPEN curkillproc \r\n FETCH NEXT FROM \r\n curkillproc \r\n INTO @varspid, @vardbname \r\nWHILE @@fetch_status = 0 \r\nBEGIN \r\n EXEC('kill ' + @varspid) \r\n SET @numUsers = @numUsers + 1 \r\n FETCH NEXT FROM curkillproc \r\n INTO @varspid, @vardbname \r\n END \r\nCLOSE curkillproc \r\nDEALLOCATE curkillproc \r\n SELECT @numUsers as NumUsersDisconnected \r\n", databaseName);

SqlCommand cmd = new SqlCommand(query, sqlConnection);
cmd.CommandTimeout = commandTimeout;

try
{
return (int)cmd.ExecuteScalar();
}
catch
{
throw;
}
}


Espero que les sea útil.

Saludos

Adalberto Montanía

Comentarios