簡體   English   中英

刪除SQL Server數據庫:處理並發連接

[英]Dropping SQL Server database: handling concurrent connections

在集成測試期間,我嘗試使用以下方法刪除數據庫:

USE master
ALTER DATABASE TestXyz SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE TestXyz

但是,很多時候(給定測試次數),應用程序后台進程之一設法在SET SINGLE_USERDROP DATABASE ,這使其成為數據庫的單個用戶並破壞了DROP

我不能使用RESTRICTED_USER ,因為該應用程序當前具有db_owner權限(由於大量的舊代碼,其中一些要求使用它,因此不會僅出於測試目的對其進行更改)。

我不能使用OFFLINE因為它不會從磁盤上刪除數據庫文件。

您將如何解決這個問題?

好的計划b ...迭代一連串的連接並重命名數據庫,以使其脫離應用程序域。 然后放下它。 為了處理通過連接進行的迭代,希望對重命名進行嘗試才能使其運行,直到能夠刪除連接為止。 下面的示例代碼創建一個數據庫TestDB。 在while循環中將其重命名為testdb2,然后在循環成功后將其刪除。

-- Setup a scratch Db for testing
create database testdb
go
use testdb

while exists (select name from sys.databases where name = 'testdb')
Begin
  DECLARE @DbName nvarchar(50) SET @DbName = N'testdb'

    DECLARE @EXECSQL varchar(max) SET @EXECSQL = ''

    SELECT @EXECSQL = @EXECSQL + 'Kill ' + Convert(varchar, SPId) + ';' 
    FROM MASTER..SysProcesses 
    WHERE DBId = DB_ID(@DbName) AND SPId <> @@SPId

    EXEC(@EXECSQL)

    Begin try
        EXEC sp_renamedb 'testdb', 'testdb2'
    end try
    Begin Catch
    print 'failed to rename'
    End Catch
end

drop database testdb2

嘗試一次:

  1. 停止應用程序服務並運行查詢。
  2. 停止應用程序服務並重新啟動SQL Server Services ,然后運行查詢。

我終於使用以下方法解決了它:

ALTER LOGIN MyAppUser DISABLE
ALTER DATABASE TestXyz SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE TestXyz
ALTER LOGIN MyAppUser ENABLE

由於可以在測試數據庫管理過程中使用不同的登錄名,因此可以阻止應用程序訪問數據庫。 (此處使用SINGLE_USER的原因僅僅是踢出已連接的用戶。我尚未檢查ALTER LOGIN已執行該操作,但我認為沒有這樣做)。

另一種選擇是在刪除MyAppUser之前將其從數據庫中刪除,但是我只是現在才考慮過它,因此沒有代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM