2012-09-06 64 views
1

我已經根據一組條件創建了一個我想刪除的數據庫列表,並在主數據庫中標記爲delete_table(這已經不包括master,tempdb,model和msdb) 。該表中唯一的列是name,其中包含應刪除的確切數據庫名稱。從列表中有條件地刪除服務器上的數據庫

我該如何編寫基於這個列表來刪除服務器上的數據庫的腳本?

謝謝!

回答

1

快捷方式

DECLARE @SQL VARCHAR(MAX) = '' 
SELECT @SQL = @SQL+ 'DROP DATABASE ' + QUOTENAME(name) + ';' 
FROM delete_table 
EXECUTE (@SQL) 

比較安全的方式,以確保數據庫中存在,並且每個數據庫中獲取的腳本只有一次櫃面你的DUP

DECLARE @SQL VARCHAR(MAX) = '' 
SELECT @SQL = @SQL+ 'DROP DATABASE ' + QUOTENAME(name) + ';' 
FROM sys.databases WHERE name IN (SELECT name FROM delete_table); 
EXECUTE (@SQL) 

編輯添加ALTER DATABASE只需添加本line

DECLARE @SQL VARCHAR(MAX) = '' 
SELECT @SQL = @SQL+ 
'ALTER DATABASE '+ QUOTENAME(name) + 'SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' + 
'DROP DATABASE ' + QUOTENAME(name) + ';' 
FROM sys.databases WHERE name IN (SELECT name FROM delete_table); 
EXECUTE (@SQL) 
+0

謝謝!這工作很好。最後一件事,有沒有辦法做到:ALTER DATABASE [database_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE命令很容易適用於所有數據庫? – user1652985

+0

我已經添加了「alter database set single user ...」 – ClearLogic

2

如果你想有一個快速的方法來編寫腳本DROP DATABASE命令:

--set database in single user mode, rolling back active transactions...be careful! 
SELECT 'ALTER DATABASE ' + QUOTENAME(name) + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' FROM sys.databases WHERE name IN (...) 
UNION 
--drop database 
SELECT 'DROP DATABASE ' + QUOTENAME(name) + ';' FROM sys.databases WHERE name IN (...); 

更換...與數據庫名稱的逗號分隔的列表(例如N'DatabaseOne', 'DatabaseTwo'等)。運行select查詢,然後使用結果執行。

我不明白需要一個用戶表來解決這個問題。作爲一個附註,你應該避免在master數據庫中創建用戶對象。當然,我想不出一個基於美學的理由,但它似乎是錯誤

更多關於在系統數據庫中用戶創建的對象...

MSDN狀態的用戶對象不應該在master創建,但我想提供的原因是相當薄弱。一個更實質的論點是缺乏對服務包/版本升級期間系統數據庫對象發生的控制的控制。

我不是說下一個服務包升級將會消除您在master中創建的用戶對象,但是誰知道。將您的實用程序和管理類型對象置於用戶創建的數據庫中,以免混淆。

+0

同意不在m中創建用戶對象紫苑。 – Paparazzi

+0

如果我要刪除腳本完成後創建的表,該怎麼辦? – user1652985

+0

我不明白爲什麼需要數據庫名稱表。爲什麼不把你的條件直接放在上面提供的查詢中?告訴我們您的條件是放棄數據庫,我們可以將其納入解決方案。 – Bryan

相關問題