2011-12-20 21 views
7

私はこのデータベースを一時データベースではなく 'master'データベースで使用しました。'master'データベース内のすべてのデータを誤って削除しました

sp_msforeachtable 'delete from ?' 

弊害はありますか?もしそうなら、どのようにしてデータを復元できますか?

+3

最新のマスターDBのバックアップを復元します。あなたは1つ、右がありますか? –

+0

私は持っていません。 SQL Serverを再インストールする必要があるため、重要なデータがない個人用開発DBです。 – Stijn

+0

SQL Server Studio、そうですか? –

答えて

10

いいえ、削除してはいけません(masterにユーザーテーブルがないと仮定します)。

テスト

exec sys.sp_MSforeachtable 'select ''?''' 

は私のために何かを返しません。したがって、spt_valuesなどのシステムテーブルは除外されているようです。

編集:それだけのテーブルが含まれない実際の手順の定義を見てみるとどこOBJECTPROPERTY(o.id, N'IsUserTable') = 1

+0

私はそうではないと思ったが、私はマーティンが正しいかもしれないと思う。 +1。 – JonH

+0

うわー!ありがとう!私はデータベースを吹き飛ばしたと思って、私は再インストールを行う準備ができました。これは、Sql Server Studioのプルダウンメニューから目的のデータベースが選択されているかどうかをチェックしないと発生します。なぜマイクロソフトですか?クエリウィンドウを開く前に明示的にデータベースを選択するように誰かに依頼できませんでしたか?彼らがIsUserTable状態に置かれた神に感謝します。ユーザビリティは確かにマイクロソフトの特徴の1つではありません。 –

+0

あなたの答えは有用で安心ですが、 'OBJECTPROPERTY'節は再インストールからStijnを保存したものではありません。同じミスをした後、私はプロシージャの実装について興味深いことをいくつか発見しました。例については、[my answer](http://stackoverflow.com/a/12530893/111424)を参照してください。 –

5

マーティン・スミスはsp_MSforeachtableは、システムテーブルを削除しないことを言う権利です。

ただし、spt_valuesMSreplication_optionsなどのテーブルはシステムテーブルと考えることもできますが、実際はSQL Serverのユーザーテーブルです。

私は私のマスター・データベースでこのクエリを実行すると:Stijnは再インストールから保存された、どのように

name     IsUserTable 
--------------------- ----------- 
spt_fallback_db  1 
spt_fallback_dev  1 
spt_fallback_usg  1 
spt_monitor   1 
MSreplication_options 1 

SELECT name, OBJECTPROPERTY(object_id, N'IsUserTable') AS IsUserTable 
FROM master.sys.tables; 

を、私は、次の結果セットを参照してください?あなたはsp_MSforeachtableがどのように実装されるかを見れば

、あなたはそれがドロップするテーブルを選択するには、このような何かを表示されます。私のマスター・データベースで

declare @mscat nvarchar(12) 
select @mscat = ltrim(str(convert(int, 0x0002))) 

SELECT * 
from dbo.sysobjects o join sys.all_objects syso on o.id = syso.object_id 
where OBJECTPROPERTY(o.id, N'IsUserTable') = 1 and o.category & @mscat = 0; 

が、これは空の結果セットを返します。

where句は、表sysobjectscategory列にビットマスクを適用して、 'mscat'以外の表を除外します。

したがって、masterデータベースのテーブルは、システムテーブルではなく 'Microsoft'テーブルであるため、保護されます。出版、制約、およびアイデンティティのために使用される

カテゴリ欄のこの使用は完全にそれが持っているすべてがあいまいな記述であるBooks Onlineに文書化されていません。

しかし、sysobjectsテーブルは、とにかく推奨されないので、使用しないでください。 :)サポートビューsys.tablesを使用して

同等のクエリは次のようになります。私のマスター・データベースで

SELECT * 
FROM sys.tables 
WHERE is_ms_shipped = 0; 

を、これはまた、空の結果セットを返します。

+0

+1良い修正。 –

関連する問題