如何断开数据库中正在使用的所有用户

本文介绍了SQL Server数据库管理的一些实用技巧,包括如何使数据库离线、创建存储过程来杀死特定数据库的所有进程、中断除自己之外的所有连接等。此外还提供了SQL Server的关闭方法及注意事项。

1。SQL2005中可以右键点击数据库名字/任务/脱机即可。 

2。

if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N'[dbo].[killspid]')  and  OBJECTPROPERTY(id,  N'IsProcedure')  =  1) 

   drop  procedure  [dbo].[p_killspid] 

  GO

use     master    

go  

create     proc     killspid     (@dbname     varchar(20))      

as      

begin      

declare     @sql     nvarchar(500),@temp   varchar(1000)  

declare     @spid     int      

set     @sql='declare     getspid     cursor     for          

select     spid     from     sysprocesses     where     dbid=db_id('''+@dbname+''')'      

exec     (@sql)      

open     getspid      

fetch     next     from     getspid     into     @spid      

while     @@fetch_status     <     >-1      

begin      

  set   @temp='kill     '+rtrim(@spid)  

  exec(@temp)  

fetch     next     from     getspid     into     @spid      

end      

close     getspid      

deallocate     getspid      

end      

 

--用法     

use     master      

exec     killspid     '数据库名'  

3。

--没必要停掉整个  sql   server  

  use   master  

  --ALTER   DATABASE   test   set   online    

  declare   @   varchar(200)  

  set   @   =   ''  

  select   @   =   @   +'   kill   '+   cast(spid   as   varchar)    

  from   master..sysprocesses    

  where   dbid=db_id('Test')  

  exec(@)  

  ALTER   DATABASE   test   set   offline

4。SHUTDOWN  
  立即停止   Microsoft®   SQL   Server™。  
   
  语法  
  SHUTDOWN   [   WITH   NOWAIT   ]  
   
  参数  
  WITH   NOWAIT  
   
  立即关闭   SQL   Server   而不在每个数据库内执行检查点。在尝试终止所有用户进程后退出   SQL   Server,并对每个活动事务执行回滚操作。  
   
  注释  
  除非   sysadmin   固定服务器角色成员指定   WITH   NOWAIT   选项,否则   SHUTDOWN   尝试关闭   SQL   Server   时的顺序方式为:    
   
  禁用登录(sysadmin   固定服务器角色成员除外)。若要查看所有当前用户的列表,请执行   sp_who。  
   
   
  等待当前正在执行的   Transact-SQL   语句或存储过程执行完毕。若要查看所有活动进程和锁的列表,请执行   sp_lock   和   sp_who。  
   
   
  在每个数据库内执行检查点。    
  当   sysadmin   固定服务器角色成员重新启动   SQL   Server   时,使用   SHUTDOWN   语句可以将需要做的自动恢复工作减到最小。  
   
  还可以使用下面这些工具和方法停止   SQL   Server。每个工具或方法都在所有数据库内执行检查点。从数据高速缓存中刷新所有提交的数据后,通过下列工具和方法停止服务器:    
   
  使用   SQL   Server   企业管理器。  
   
   
  在命令提示符下使用   net   stop   mssqlserver。  
   
   
  使用"控制面板"中的"服务"应用程序。  
   
   
  使用   SQL   Server   服务管理器。    
  如果是从命令提示符下启动的   sqlservr.exe,按   CTRL+C   键可关闭   SQL   Server。然而,按   CTRL+C   键将不执行检查点。  
   
   
   
  说明     通过   Server   企业管理器、net   stop、控制面板和   SQL   Server   服务管理器停止   SQL   Server   的方法所生成的服务控制消息与使用   SERVICE_CONTROL_STOP   停止   SQL   Server   所生成的相同。  
   
   
  权限  
  SHUTDOWN   权限默认授予   sysadmin   和   serveradmin   固定服务器角色的成员且不可转让。

5。

--中断除了自己外的连接。 

   

  declare   @sql   varchar(100)  

   

  while   1=1  

  begin  

   

  select   top   1   @sql   =   'kill   '+cast(spid   as   varchar(3))  

  from     master..sysprocesses      

  where   spid   >   50   and   spid   <>   @@spid    

   

  if   @@rowcount   =   0  

      break  

   

  exec(@sql)  

  end

备注:以上均未经过测试.

<think>我们正在讨论如何删除正在使用中的数据库。根据用户提供的引用,特别是引用[1]和引用[2],删除正在使用数据库的常见方法是先将数据库设置为单用户模式,然后再执行删除操作。引用[3]也提供了一种使用游标的方法,但相对复杂。引用[4]提到的soundex()函数与当前问题无关。 核心步骤(以SQL Server为例): 1. 将数据库设置为单用户模式(SINGLE_USER),这样只允许一个用户连接(即当前连接),其他连接会被终止。 2. 然后执行删除数据库命令。 具体操作: 方法一(通过ALTER DATABASE设置单用户模式): ```sql USE master; -- 切换到master数据库,因为不能删除当前正在使用数据库 GO ALTER DATABASE [数据库名] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; -- 立即回滚所有未完成事务并断开其他连接 GO DROP DATABASE [数据库名]; -- 删除数据库 GO ``` 方法二(使用存储过程或脚本,如引用[3]所示,但更复杂,一般不推荐): 引用[3]中使用游标来动态执行语句,但本质上也是先断开其他连接再删除。 注意: - 将`[数据库名]`替换为实际要删除的数据库名称。 - 在设置单用户模式时,使用`WITH ROLLBACK IMMEDIATE`选项会立即回滚所有未完成事务并断开其他所有连接,确保数据库可以被删除。 为什么需要这样做? 当数据库正在被其他用户或进程使用时,直接删除会失败。通过设置为单用户模式,我们确保只有当前连接可以访问该数据库,从而安全删除。 另外,引用[1]提到通过SQL Server Management Studio (SSMS)图形界面操作: 1. 右键点击数据库 -> 属性 -> 选项 -> 状态 -> 限制访问 -> 选择“Single”-> 确定。 2. 然后再次执行删除操作。 但是,使用T-SQL脚本更加高效和可重复,特别是在自动化脚本中。 示例: 假设要删除名为`TestDB`的数据库,执行以下脚本: ```sql USE master; GO ALTER DATABASE TestDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DROP DATABASE TestDB; GO ``` 如果执行成功,数据库将被删除。 注意事项: - 此操作会强制断开所有其他连接,可能会导致其他用户的操作中断,因此应在维护时段进行。 - 确保有数据库的备份(如果需要)再进行删除。 生成相关问题: 1. 如何安全删除SQL Server数据库? 2. 删除数据库时提示“数据库正在使用”怎么办? 3. 除了单用户模式,还有其他方法删除正在使用数据库吗? 4. 如何批量删除多个正在使用数据库? 5. 在SQL Server中,如何查看当前哪些进程正在使用某个数据库? </think>### 如何删除正在使用中的数据库 根据引用内容,删除正在使用数据库需要先解除其占用状态。以下是具体操作步骤: #### 方法一:通过 SQL 命令强制删除(推荐) ```sql USE master; -- 切换到系统数据库 GO ALTER DATABASE [数据库名] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; -- 强制断开所有连接[^2] GO DROP DATABASE [数据库名]; -- 执行删除 GO ``` **关键参数说明**: - `SET SINGLE_USER`:将数据库设为单用户模式 - `WITH ROLLBACK IMMEDIATE`:立即终止所有活动连接并回滚事务[^2] - 将 `[数据库名]` 替换为实际数据库名称 #### 方法二:通过 SSMS 图形界面操作 1. 右键点击目标数据库 → 属性 → 选项 2. 在 **状态 → 限制访问** 中选择 `SINGLE_USER`[^1] 3. 点击确定后立即执行删除操作 #### 方法三:终止特定进程(高级) 若需精确控制连接: ```sql USE master; GO DECLARE @kill varchar(8000) = ''; SELECT @kill = @kill + 'KILL ' + CAST(spid AS varchar(5)) + ';' FROM sys.sysprocesses WHERE dbid = DB_ID('数据库名'); EXEC(@kill); -- 终止所有相关进程 DROP DATABASE [数据库名]; ``` #### ⚠️ 注意事项 1. **数据安全**:操作前务必备份重要数据 2. **影响范围**:`ROLLBACK IMMEDIATE` 会强制终止所有活动事务 3. **权限要求**:需要 `ALTER ANY DATABASE` 权限 4. 若数据库正在备份/还原,需先停止相关作业 > **示例**:删除名为 `SalesDB` 的数据库 > ```sql > USE master; > GO > ALTER DATABASE SalesDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE; > GO > DROP DATABASE SalesDB; > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值