我已經根據一組條件創建了一個我想刪除的數據庫列表,並在主數據庫中標記爲delete_table
(這已經不包括master,tempdb,model和msdb) 。該表中唯一的列是name
,其中包含應刪除的確切數據庫名稱。從列表中有條件地刪除服務器上的數據庫
我該如何編寫基於這個列表來刪除服務器上的數據庫的腳本?
謝謝!
我已經根據一組條件創建了一個我想刪除的數據庫列表,並在主數據庫中標記爲delete_table
(這已經不包括master,tempdb,model和msdb) 。該表中唯一的列是name
,其中包含應刪除的確切數據庫名稱。從列表中有條件地刪除服務器上的數據庫
我該如何編寫基於這個列表來刪除服務器上的數據庫的腳本?
謝謝!
快捷方式
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)
如果你想有一個快速的方法來編寫腳本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
中創建的用戶對象,但是誰知道。將您的實用程序和管理類型對象置於用戶創建的數據庫中,以免混淆。
同意不在m中創建用戶對象紫苑。 – Paparazzi
如果我要刪除腳本完成後創建的表,該怎麼辦? – user1652985
我不明白爲什麼需要數據庫名稱表。爲什麼不把你的條件直接放在上面提供的查詢中?告訴我們您的條件是放棄數據庫,我們可以將其納入解決方案。 – Bryan
謝謝!這工作很好。最後一件事,有沒有辦法做到:ALTER DATABASE [database_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE命令很容易適用於所有數據庫? – user1652985
我已經添加了「alter database set single user ...」 – ClearLogic