代码之家  ›  专栏  ›  技术社区  ›  nick

如何在sql脚本中指定“关闭现有连接”

  •  137
  • nick  · 技术社区  · 17 年前

    我正在SQLServer2008中对我的模式进行积极的开发,经常想重新运行我的drop/create数据库脚本。当我跑的时候

    USE [master]
    GO
    
    IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase')
    DROP DATABASE [MyDatabase]
    GO
    

    我经常犯这种错误

    Msg 3702, Level 16, State 4, Line 3
    Cannot drop database "MyDatabase" because it is currently in use.
    

    如果右键单击对象资源管理器窗格中的数据库并从上下文菜单中选择删除任务,则会出现一个复选框,用于“关闭现有连接”

    有没有办法在我的脚本中指定此选项?

    5 回复  |  直到 17 年前
        1
  •  269
  •   Andomar    17 年前

    您可以断开每个人的连接并回滚他们的事务,方法是:

    alter database [MyDatbase] set single_user with rollback immediate
    

    之后,您可以安全地删除数据库:)

        2
  •  40
  •   hgmnz    17 年前

    转到ManagementStudio并执行您描述的所有操作,只需单击脚本而不是单击OK。它将显示它将运行的代码,然后您可以将这些代码合并到脚本中。

    在这种情况下,您需要:

    ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    
        3
  •  17
  •   AlexD    13 年前

    ALTER DATABASE SET 在文档中,将数据库设置为单用户模式后,仍有可能无法访问该数据库:

    在将数据库设置为单用户之前,请验证AUTO\u UPDATE\u STATISTICS\u ASYNC选项是否设置为OFF。当设置为ON时,用于更新统计信息的后台线程与数据库建立连接,您将无法在单用户模式下访问数据库。

    DECLARE @dbId int
    DECLARE @isStatAsyncOn bit
    DECLARE @jobId int
    DECLARE @sqlString nvarchar(500)
    
    SELECT @dbId = database_id,
           @isStatAsyncOn = is_auto_update_stats_async_on
    FROM sys.databases
    WHERE name = 'db_name'
    
    IF @isStatAsyncOn = 1
    BEGIN
        ALTER DATABASE [db_name] SET  AUTO_UPDATE_STATISTICS_ASYNC OFF
    
        -- kill running jobs
        DECLARE jobsCursor CURSOR FOR
        SELECT job_id
        FROM sys.dm_exec_background_job_queue
        WHERE database_id = @dbId
    
        OPEN jobsCursor
    
        FETCH NEXT FROM jobsCursor INTO @jobId
        WHILE @@FETCH_STATUS = 0
        BEGIN
            set @sqlString = 'KILL STATS JOB ' + STR(@jobId)
            EXECUTE sp_executesql @sqlString
            FETCH NEXT FROM jobsCursor INTO @jobId
        END
    
        CLOSE jobsCursor
        DEALLOCATE jobsCursor
    END
    
    ALTER DATABASE [db_name] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
    
    DROP DATABASE [db_name]
    
        4
  •  4
  •   Abhishek Upadhyay    9 年前

    我知道为时已晚,但也许对某些人有帮助。使用此选项时,请使数据库脱机

    ALTER DATABASE dbname SET OFFLINE
    
        5
  •  1
  •   Deiwys    12 年前

    我尝试了hgmnz在SQL Server 2012上所说的话。

    为我创建的管理:

    EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase'
    GO
    USE [master]
    GO
    /****** Object:  Database [MyDataBase]    Script Date: 09/09/2014 15:58:46 ******/
    DROP DATABASE [MyDataBase]
    GO
    
        6
  •  0
  •   ali fuat    5 年前

        7
  •  -1
  •   Shailesh Tiwari    7 年前

    尝试使用此C#代码删除数据库

    公共静态数据库(字符串数据库) {

            string sql =  "ALTER DATABASE "  + dataBase + "SET SINGLE_USER WITH ROLLBACK IMMEDIATE" ;
    
            using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBRestore"].ConnectionString))
            {
                connection.Open();
                using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
                {
                    command.CommandType = CommandType.Text;
                    command.CommandTimeout = 7200;
                    command.ExecuteNonQuery();
                }
                sql = "DROP DATABASE " + dataBase;
                using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
                {
                    command.CommandType = CommandType.Text;
                    command.CommandTimeout = 7200;
                    command.ExecuteNonQuery();
                }
            }
        }