احتمالا تاکنون هنگام Restore نمودن یک پایگاه داده با خطای زیر مواجه شده اید.
Msg 3101, Level 16, State 1, Line 1
Exclusive access could not be obtained because the database is in use.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
البته
مشکل فوق زمانی پیش خواهد آمد که پایگاه داده توسط شخص یا برنامه ای در
حال استفاده باشد و تا زمانی که این اتصالات وجود داشته باشند امکان
Restore نمودن پایگاه داده وجود ندارد.
معمولا در این هنگام با
Restart نمودن سرور برنامه SQL Server مشکل خاتمه می یابد و پس از آن به
راحتی می توان پایگاده داده را Restore نمود. اما این عمل گاهی به سادگی
امکان پذیر نیست و یا مشکلات دیگری را در پی خواهد داشت.
Restart
نمودن سرور برنامه SQL Server باعث می شود که برای مدتی (در حین راه اندازی
مجدد سرور) تمام پایگاه های داده موجود در این سرور از کار بیفتند و بدیهی
می باشد که این مسئله می تواند مشکلاتی را برای سایر پایگاه های داده به
وجود آورد. و ضمنا با توجه به تعداد پایگاه های داده و سایر عوامل، عمل راه
اندازی مجدد سرور می تواند زمانبر باشد.
راه حل:
با استفاده از اسکریپت زیر می توان تمام اتصالات زنده ی موجود به یک پایگاه داده خاص را از بین برد.
Use Master
Go
Declare@dbnamesysname
Set@dbname = 'databaseName'
Declare@spidint Select@spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) While@spidIsNotNull Begin Execute ('Kill ' + @spid) Select@spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) and spid > @spid End