[英]Generate a block of serial numbers from SQL Server while handling concurrent connections?
[英]Dropping SQL Server database: handling concurrent connections
在集成測試期間,我嘗試使用以下方法刪除數據庫:
USE master
ALTER DATABASE TestXyz SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE TestXyz
但是,很多時候(給定測試次數),應用程序后台進程之一設法在SET SINGLE_USER
和DROP 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
嘗試一次:
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.