2011-12-20 33 views
7

Tôi đã vô tình sử dụng tập lệnh này trên cơ sở dữ liệu 'chính' thay vì cơ sở dữ liệu tạm thời.Vô tình xóa tất cả dữ liệu trong cơ sở dữ liệu 'chủ'

sp_msforeachtable 'delete from ?' 

Có gây hại gì không? Nếu vậy, làm thế nào tôi có thể khôi phục dữ liệu?

+3

Khôi phục bản sao lưu DB chính mới nhất của bạn. Bạn có một, phải không? –

+0

Tôi không có. Đó là một DB phát triển cá nhân không có dữ liệu quan trọng, vì vậy điều tồi tệ nhất có thể xảy ra là tôi phải cài đặt lại SQL Server. – Stijn

+0

SQL Server Studio, phải không? –

Trả lời

10

Không cần xóa bất kỳ thứ gì (giả sử bạn không có bảng người dùng nào trong số master).

Testing

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

Không trả về bất cứ điều gì cho tôi. Vì vậy, có vẻ như loại trừ các bảng hệ thống như spt_values.

Chỉnh sửa: Thật vậy Nhìn vào định nghĩa của các thủ tục nó chỉ bao gồm các bảng nơi OBJECTPROPERTY(o.id, N'IsUserTable') = 1

+0

Tôi nghĩ khác đi nhưng tôi nghĩ Martin có thể đúng. +1. – JonH

+0

Woah! Cảm ơn! Tôi nghĩ rằng tôi thổi đi cơ sở dữ liệu của tôi và tôi đã sẵn sàng để làm một cài đặt lại. Đây là những gì sẽ xảy ra khi bạn không kiểm tra nếu cơ sở dữ liệu bạn muốn được chọn trình đơn kéo xuống trong Sql Server Studio. Tại sao là Microsoft? Tại sao bạn không thể yêu cầu ai đó giải thích chọn cơ sở dữ liệu trước khi mở cửa sổ truy vấn? Cảm ơn thần họ đặt trong điều kiện IsUserTable. Khả năng sử dụng chắc chắn không phải là một trong những điểm nổi bật của Microsoft. –

+0

Câu trả lời của bạn hữu ích và yên tâm, nhưng mệnh đề 'OBJECTPROPERTY' không phải là những gì đã lưu Stijn từ cài đặt lại. Sau khi tự mình mắc sai lầm, tôi đã khám phá ra một số điều thú vị về việc thực hiện quy trình. Vui lòng xem [câu trả lời của tôi] (http://stackoverflow.com/a/12530893/111424) để biết ví dụ. –

5

Martin Smith là đúng khi nói rằng sp_MSforeachtable không xóa bảng hệ thống.

Tuy nhiên, mặc dù chúng tôi có thể nghĩ đến các bảng như spt_valuesMSreplication_options dưới dạng bảng hệ thống, chúng nằm trong bảng người dùng thực tế theo SQL Server.

Khi tôi chạy truy vấn này trong cơ sở dữ liệu tổng thể của tôi:

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

tôi thấy các tập kết quả sau:

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

Vậy làm thế nào được Stijn cứu khỏi một cài đặt lại?

Nếu bạn nhìn vào cách sp_MSforeachtable được thực hiện, bạn sẽ thấy nó làm điều gì đó như thế này để chọn bảng để thả:

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; 

Trong cơ sở dữ liệu tổng thể của tôi, điều này sẽ trả về một tập kết quả trống.

Điều khoản where áp dụng bitmask vào cột category của bảng sysobjects để loại trừ các bảng không phải là 'mscat'.

Vì vậy, các bảng trong cơ sở dữ liệu chính được bảo vệ không phải vì chúng là các bảng hệ thống, mà vì chúng là các bảng 'Microsoft'.

sử dụng này của cột loại là hoàn toàn không có cơ sở trong Books Online Tất cả nó có là một mô tả mơ hồ:

Được sử dụng để công bố, hạn chế, và bản sắc.

Nhưng bảng sysobjects không được dùng nữa, vì vậy bạn không nên sử dụng bảng này. :)

Một truy vấn tương đương sử dụng giao diện hỗ trợ sys.tables sẽ trông như thế này:

SELECT * 
FROM sys.tables 
WHERE is_ms_shipped = 0; 

Trong cơ sở dữ liệu tổng thể của tôi, điều này cũng trả về một tập kết quả trống.

+0

+1 Điều chỉnh tốt. –

Các vấn đề liên quan