一連の条件に基づいて削除するデータベースのリストを作成delete_table
し、マスターデータベースにタイトルを付けました(これには、master、tempdb、model、およびmsdbは既に含まれていません)。この表の唯一の列にはname
、削除する必要のある正確なデータベース名が含まれています。
このリストに基づいてサーバー上のデータベースを削除するスクリプトを作成するにはどうすればよいですか?
ありがとう!
一連の条件に基づいて削除するデータベースのリストを作成delete_table
し、マスターデータベースにタイトルを付けました(これには、master、tempdb、model、およびmsdbは既に含まれていません)。この表の唯一の列にはname
、削除する必要のある正確なデータベース名が含まれています。
このリストに基づいてサーバー上のデータベースを削除するスクリプトを作成するにはどうすればよいですか?
ありがとう!
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'
など)。選択クエリを実行し、結果を使用して実行します。
これを解決するためのユーザーテーブルの必要性を理解していません。master
補足として、データベースにユーザーオブジェクトを作成することは避けてください。確かに、美学以外の理由は考えられませんが、それは間違っているようです。
システムデータベースでユーザーが作成したオブジェクトの詳細...
MSDNは、ユーザーオブジェクトをで作成するべきではないと述べていますがmaster
、提供される理由はかなり弱いと思います。より実質的な議論には、サービスパック/バージョンのアップグレード中にシステムデータベースオブジェクトに何が起こるかを制御できないことが含まれます。
次のサービスパックのアップグレードで、でユーザーが作成したオブジェクトが一掃されるとは言っていませんがmaster
、誰が知っていますか。ユーティリティと管理タイプのオブジェクトをユーザーが作成したデータベースに配置して、混乱が生じないようにします。
迅速な方法
DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL+ 'DROP DATABASE ' + QUOTENAME(name) + ';'
FROM delete_table
EXECUTE (@SQL)
データベースが存在し、重複がある場合に備えて各データベースが1回だけスクリプト化されることを確認するための少し安全な方法
DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL+ 'DROP DATABASE ' + QUOTENAME(name) + ';'
FROM sys.databases WHERE name IN (SELECT name FROM delete_table);
EXECUTE (@SQL)
編集して変更データベースを追加するには、この行を追加するだけです
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)