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_values
và MSreplication_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.
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? –
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
SQL Server Studio, phải không? –