你如何停止Sql Server的用户实例?(即使在停止Sql Express服务后,Sql Express用户实例数据库文件也被锁定)

Bit*_*der 6 sql locking wix file sql-server-express

使用SQL Server Express 2005的用户实例功能时,连接字符串如下所示:

<add name="Default" connectionString="Data Source=.\SQLExpress;
  AttachDbFilename=C:\My App\Data\MyApp.mdf;
  Initial Catalog=MyApp;
  User Instance=True;
  MultipleActiveResultSets=true;
  Trusted_Connection=Yes;" />
Run Code Online (Sandbox Code Playgroud)

我们发现即使在停止SqlExpress服务之后我们也无法复制数据库文件MyApp.mdf和MyApp_Log.ldf(因为它们已被锁定),并且不得不求助于将SqlExpress服务从自动启动模式设置为手动启动模式,然后重新启动机器,然后我们才能复制文件.

我的理解是,停止SqlExpress服务也应该停止所有用户实例,这应该释放这些文件的锁.但事实似乎并非如此 - 是否有人可以了解如何停止用户实例,以至于它的数据库文件不再被锁定?


更新

好吧,我不再懒惰并启动Process Explorer.锁是由sqlserver.exe保存的 - 但是有两个sql server实例:

sqlserver.exe  PID: 4680  User Name: DefaultAppPool
sqlserver.exe  PID: 4644  User Name: NETWORK SERVICE
Run Code Online (Sandbox Code Playgroud)

该文件由sqlserver.exe实例打开,PID为:4680

停止"SQL Server(SQLEXPRESS)"服务,使用PID:4644终止进程,但仅剩下PID:4680.

看到剩下的进程的所有者是DefaultAppPool,我尝试的下一件事就是停止IIS(这个数据库是从ASP.Net应用程序中使用的).不幸的是,这并没有扼杀这个过程.

手动删除剩余的sql server进程会删除数据库文件上的打开文件句柄,允许复制/移动它们.

不幸的是,我希望在WiX安装程序的一些安装前/后安装任务中复制/恢复这些文件 - 因此我希望有一种方法可以通过停止Windows服务来实现这一点,而不是必须弹出来杀死所有实例sqlserver.exe因为这会带来一些问题:

  1. 杀死所有sqlserver.exe实例可能会对其计算机上具有其他Sql Server实例的用户产生不良后果.
  2. 我无法轻松重启这些实例.
  3. 在安装程序中引入了额外的复杂性.

有没有人对如何关闭与特定用户实例关联的sql server实例有任何进一步的想法?

AMi*_*ico 7

使用"SQL Server Express Utility"(SSEUtil.exe)或命令分离SSEUtil使用的数据库.

SQL Server Express实用程序,SSEUtil是一个可以让您轻松与SQL Server交互的工具,http://www.microsoft.com/downloads/details.aspx? FamilyID = fa87e828-173f-47e-a85c-27ed01cf6b02 &DisplayLang = en

此外,在最后一次连接关闭后停止服务的默认超时是一小时.在开发框中,您可能希望将其更改为五分钟(允许的最小值).

此外,您可以通过Visual Studio的服务器资源管理器数据连接进行打开连接,因此请确保从那里的任何数据库断开连接.

H:\Tools\SQL Server Express Utility>sseutil -l
1. master
2. tempdb
3. model
4. msdb
5. C:\DEV_\APP\VISUAL STUDIO 2008\PROJECTS\MISSICO.LIBRARY.1\CLIENTS\CORE.DATA.C
LIENT\BIN\DEBUG\CORE.DATA.CLIENT.MDF

H:\Tools\SQL Server Express Utility>sseutil -d C:\DEV*
Failed to detach 'C:\DEV_\APP\VISUAL STUDIO 2008\PROJECTS\MISSICO.LIBRARY.1\CLIE
NTS\CORE.DATA.CLIENT\BIN\DEBUG\CORE.DATA.CLIENT.MDF'

H:\Tools\SQL Server Express Utility>sseutil -l
1. master
2. tempdb
3. model
4. msdb

H:\Tools\SQL Server Express Utility>
Run Code Online (Sandbox Code Playgroud)

使用.NET Refector,以下命令用于分离数据库.

string.Format("USE master\nIF EXISTS (SELECT * FROM sysdatabases WHERE name = N'{0}')\nBEGIN\n\tALTER DATABASE [{1}] SET OFFLINE WITH ROLLBACK IMMEDIATE\n\tEXEC sp_detach_db [{1}]\nEND", dbName, str);
Run Code Online (Sandbox Code Playgroud)