6

मैं इस प्रश्न को किसी भी तरह से कैसे कर सकता हूं:डीबी से सभी टेबल कैसे हटाएं? Sys.tables से हटा नहीं सकता है

delete from sys.tables where is_ms_shipped = 0 

क्या हुआ, मैंने एक बहुत बड़ी क्वेरी निष्पादित की और मैं इसके शीर्ष पर USE निर्देश डालना भूल गया, अब मुझे अपने मास्टर डीबी पर एक अरब टेबल मिल गया है , और उन्हें एक-एक करके हटाना नहीं चाहते हैं।

अद्यतन: यह एक नया डेटाबेस है, इसलिए मुझे किसी भी पिछले डेटा की परवाह नहीं है, अंतिम परिणाम जो मैं हासिल करना चाहता हूं वह है कि मास्टर डीबी को फैक्टरी शिपिंग में रीसेट करना है।

+1

'sys। *' ऑब्जेक्ट्स सिस्टम कैटलॉग ** विचार ** हैं जो आपको क्वेरी करने की अनुमति देते हैं - लेकिन आपके डेटाबेस में ऑब्जेक्ट्स के विचारों में हेरफेर नहीं करते हैं। वस्तुओं को बनाने या ड्रॉ करने के लिए, उन उपयुक्त SQL आदेशों का उपयोग करें। –

+0

हां मुझे एहसास हुआ। मैं अपने बदलावों को पाने के लिए किसी भी तरह की तलाश कर रहा था। – Shimmy

उत्तर

1

सरल और सबसे छोटा रास्ता (b को नष्ट करने के पहले प्रयास पर नाकाम रहने और उसके बाद आगे बढ़ने के बाद दूसरे लूप पर a समाशोधन) यह साधारण परीक्षण पर ठीक काम करता है मैं इस था:

How to Rebuild System Databases in SQL Server 2008

अन्य सभी जवाब यहां के साथ समस्या यह है कि यह काम नहीं करता, के बाद से वहाँ r हो रहा है elated टेबल और यह निष्पादित करने से मना कर दिया।

यह एक, न केवल यह काम करता है बल्कि वास्तव में मैं जो खोज रहा हूं: "कारखाने के डिफ़ॉल्ट पर रीसेट करें" जैसा कि प्रश्न में बताया गया है।
यह भी सब कुछ हटा देगा, न केवल टेबल।

7

यदि यह एक बार की समस्या है, तो तालिकाओं को हटाने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग करें।

आप एक स्क्रिप्ट चलाना चाहिए तो बहुत, बहुत ध्यान से इस का उपयोग करें:

EXEC sp_msforeachtable 'DROP TABLE ?' 
+0

क्या आप बाकी को भर सकते हैं? मैंने अपना जवाब अपडेट कर दिया है। – Shimmy

+0

@Shimmy: अद्यतन उत्तर देखें। यह डेटाबेस में सभी उपयोगकर्ता तालिकाओं को छोड़ देता है, जब तक कि विदेशी कुंजी को पहले छोड़ने की आवश्यकता न हो। हालांकि, यह उपयोगकर्ताओं, समानार्थी, आदि को हटा नहीं देता है। –

+0

मेरे प्रश्न में क्वेरी भी पढ़ें, मैं सभी तालिकाओं को हटाना नहीं चाहता हूं, मैं केवल उन तालिकाओं को हटाना चाहता हूं जिन्हें मैंने गलती से जोड़ा है, जिनके साथ भेज दिया गया है स्थापना। – Shimmy

2

कोई बैकअप? :-)

एक दृष्टिकोण प्रारंभिक डेटाबेस आयात के साथ विजुअल स्टूडियो में डेटाबेस प्रोजेक्ट बनाने के लिए हो सकता है। फिर टेबल हटाएं और प्रोजेक्ट को डेटाबेस में वापस सिंक्रनाइज़ करें। एक प्रतिबद्ध चरण और यूआई के साथ "buffered" होने के दौरान आप इस दृष्टिकोण के साथ deletes en Massasse कर सकते हैं।

मैं कर रहा हूँ काफी कुछ ऊपर दृष्टिकोण (हालांकि मैं "मास्टर" अंतरिक्ष में प्रयास नहीं किया है) और साथ तालिका रिश्तों की देखभाल करने के लिए इस्तेमाल किया जा सकता है। मैं भविष्य में जीवन को आसान बनाने के साथ-साथ संस्करण-सक्षम (उदा। एससीएम के साथ) स्कीमा परिवर्तन-ट्रैकिंग की अनुमति देने के लिए एक वीएस डीबी प्रोजेक्ट (या अन्य डेटाबेस प्रबंधन उपकरण जो स्कीमा तुलना और सिंक्रनाइज़ेशन की अनुमति देता है) का उपयोग करने की भी सिफारिश करता हूं।

ओह, और जो भी हो, कृपया पहले बैकअप बनाएं। यदि कुछ और नहीं है, तो यह अच्छा प्रशिक्षण है :-)

+0

यह एक नया नया इंस्टॉलेशन इंस्टॉलेशन है, बैकअप के लिए कुछ भी नहीं था ... – Shimmy

1

बहुत ही सुरुचिपूर्ण नहीं है लेकिन यह एक बार कार्य है।

WHILE EXISTS(SELECT * FROM sys.tables where is_ms_shipped = 0) 
     EXEC sp_MSforeachtable 'DROP TABLE ?' 

create table a 
(
a int primary key 
) 
go 

create table b 
(
a int references a (a) 
) 

insert into a values (1) 

insert into b values (1) 
3

एक विधि जिसे मैंने अतीत में उपयोग किया है, जो बहुत सरल और अपेक्षाकृत मूर्खतापूर्ण है, सिस्टम टेबल/जानकारी स्कीमा (सटीक आवश्यकताओं के आधार पर) से पूछताछ करना है और इसे परिणामों के रूप में निष्पादित करना चाहते हैं जो कमांड की सूची आउटपुट करना है सेट। समीक्षा करें कि, & कॉपी करें, रन करें - त्वरित & एक बार नौकरी के लिए आसान है और क्योंकि आप अभी भी विनाशकारी बिट पर बटन को मैन्युअल रूप से मार रहे हैं, यह गलती से सामान को कचरा करने के लिए कठिन है (IMHO)।

उदाहरण के लिए:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0 
1

इस कोड को बेहतर हो सकता है, लेकिन मैं के रूप में मैं इसे लिखा था सचेत रहने के लिए कोशिश कर रहा था। मुझे लगता है कि आप अपनी टेबल को हटाने के लिए प्रतिबद्ध होने से पहले परीक्षण के लिए ट्विक करना आसान है।

DECLARE 
    @Prefix VARCHAR(50), 
    @TableName NVARCHAR(255), 
    @SQLToFire NVARCHAR(350) 

SET @Prefix = 'upgrade_%' 

WHILE EXISTS(
    SELECT 
     name 
    FROM 
     sys.tables 
    WHERE 
     name like @Prefix 
    ) 
BEGIN 
    SELECT 
     TOP 1 --This query only iterates if you are dropping tables 
     @TableName = name 
    FROM 
     sys.tables 
    WHERE 
     name like @Prefix 

    SET @SQLToFire = 'DROP TABLE ' + @TableName 

    EXEC sp_executesql @SQLToFire; 
END 
1

मैं वास्तव में कुछ इसी तरह किया था, और क्या मैं कार्य का उपयोग कर रहा था कर समापन -> केवल स्क्रिप्ट के स्क्रिप्ट डेटाबेस मूल रूप से करना डेटाबेस के सभी डेटाबेस वस्तुओं के लिए चला जाता है। मतलब डेटाबेस मैं विशाल लिपि चलाने के लिए था, जिसे मैंने इसे चलाया था। उन्नत विकल्पों में IF मौजूदियों को शामिल करना सुनिश्चित करें, फिर उस स्क्रिप्ट को मास्टर और बीएएम के विरुद्ध चलाएं, मूल लक्ष्य डेटाबेस में मौजूद सभी चीज़ों को हटा दें जो मास्टर में मौजूद हैं, अंतर को छोड़कर, जो मूल मास्टर आइटम होना चाहिए।

संबंधित मुद्दे