1

一連の条件に基づいて削除するデータベースのリストを作成delete_tableし、マスターデータベースにタイトルを付けました(これには、master、tempdb、model、およびmsdbは既に含まれていません)。この表の唯一の列にはname、削除する必要のある正確なデータベース名が含まれています。

このリストに基づいてサーバー上のデータベースを削除するスクリプトを作成するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

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'など)。選択クエリを実行し、結果を使用して実行します。

これを解決するためのユーザーテーブルの必要性を理解していません。master補足として、データベースにユーザーオブジェクトを作成することは避けてください。確かに、美学以外の理由は考えられませんが、それは間違っているようです。

システムデータベースでユーザーが作成したオブジェクトの詳細...

MSDNは、ユーザーオブジェクトをで作成するべきではないと述べていますがmaster、提供される理由はかなり弱いと思います。より実質的な議論には、サービスパック/バージョンのアップグレード中にシステムデータベースオブジェクトに何が起こるかを制御できないことが含まれます。

次のサービスパックのアップグレードで、でユーザーが作成したオブジェクトが一掃されるとは言っていませんがmaster、誰が知っていますか。ユーティリティと管理タイプのオブジェクトをユーザーが作成したデータベースに配置して、混乱が生じないようにします。

于 2012-09-06T19:22:06.780 に答える
1

迅速な方法

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)
于 2012-09-06T20:04:28.417 に答える