私はこのデータベースを一時データベースではなく 'master'データベースで使用しました。'master'データベース内のすべてのデータを誤って削除しました
sp_msforeachtable 'delete from ?'
弊害はありますか?もしそうなら、どのようにしてデータを復元できますか?
私はこのデータベースを一時データベースではなく 'master'データベースで使用しました。'master'データベース内のすべてのデータを誤って削除しました
sp_msforeachtable 'delete from ?'
弊害はありますか?もしそうなら、どのようにしてデータを復元できますか?
いいえ、削除してはいけません(master
にユーザーテーブルがないと仮定します)。
テスト
exec sys.sp_MSforeachtable 'select ''?'''
は私のために何かを返しません。したがって、spt_values
などのシステムテーブルは除外されているようです。
編集:それだけのテーブルが含まれない実際の手順の定義を見てみるとどこOBJECTPROPERTY(o.id, N'IsUserTable') = 1
私はそうではないと思ったが、私はマーティンが正しいかもしれないと思う。 +1。 – JonH
うわー!ありがとう!私はデータベースを吹き飛ばしたと思って、私は再インストールを行う準備ができました。これは、Sql Server Studioのプルダウンメニューから目的のデータベースが選択されているかどうかをチェックしないと発生します。なぜマイクロソフトですか?クエリウィンドウを開く前に明示的にデータベースを選択するように誰かに依頼できませんでしたか?彼らがIsUserTable状態に置かれた神に感謝します。ユーザビリティは確かにマイクロソフトの特徴の1つではありません。 –
あなたの答えは有用で安心ですが、 'OBJECTPROPERTY'節は再インストールからStijnを保存したものではありません。同じミスをした後、私はプロシージャの実装について興味深いことをいくつか発見しました。例については、[my answer](http://stackoverflow.com/a/12530893/111424)を参照してください。 –
マーティン・スミスはsp_MSforeachtable
は、システムテーブルを削除しないことを言う権利です。
ただし、spt_values
とMSreplication_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句は、表sysobjects
のcategory
列にビットマスクを適用して、 'mscat
'以外の表を除外します。
したがって、masterデータベースのテーブルは、システムテーブルではなく 'Microsoft'テーブルであるため、保護されます。出版、制約、およびアイデンティティのために使用される
:
カテゴリ欄のこの使用は完全にそれが持っているすべてがあいまいな記述であるBooks Onlineに文書化されていません。
しかし、sysobjects
テーブルは、とにかく推奨されないので、使用しないでください。 :)サポートビューsys.tables
を使用して
同等のクエリは次のようになります。私のマスター・データベースで
SELECT *
FROM sys.tables
WHERE is_ms_shipped = 0;
を、これはまた、空の結果セットを返します。
+1良い修正。 –
最新のマスターDBのバックアップを復元します。あなたは1つ、右がありますか? –
私は持っていません。 SQL Serverを再インストールする必要があるため、重要なデータがない個人用開発DBです。 – Stijn
SQL Server Studio、そうですか? –