2013-09-07 2 views
5

क्या दो वस्तुओं को दो अलग-अलग स्कीमा से संबंधित वस्तुओं के साथ डीबी में सभी वस्तुओं को छोड़ने का कोई तरीका है?विभिन्न स्कीमा से संबंधित SQL सर्वर डेटाबेस में सभी ऑब्जेक्ट्स ड्रॉप करें?

मैं पहले एक स्कीमा के साथ काम कर रहा था, इसलिए मैं का उपयोग कर सभी वस्तुओं क्वेरी:

Select * From sysobjects Where type=... 

तो सब कुछ मैं

Drop Table ... 

का उपयोग कर अब जब कि मैं एक और स्कीमा शुरू की है गिरा दिया, हर बार जब मैं इसे छोड़ने का प्रयास करें मेरे बारे में कुछ कहता है कि मेरे पास अनुमति नहीं है या वस्तु मौजूद नहीं है। लेकिन, अगर मैं [schema.object] के साथ ऑब्जेक्ट को उपसर्ग करता हूं तो यह काम करता है। मुझे नहीं पता कि इसे कैसे स्वचालित किया जाए, क्योंकि मुझे नहीं पता कि कौन सी वस्तुएं हैं, या ऑब्जेक्ट के दो स्कीमा किसके हैं। किसी को पता है कि सभी ऑब्जेक्ट्स को डीबी के अंदर कैसे छोड़ना है, भले ही यह किस स्कीमा से संबंधित है?

(प्रयुक्त उपयोगकर्ता दोनों स्कीमा का स्वामी है, डीबी में वस्तुओं कहा उपयोगकर्ता है, साथ ही उपयोगकर्ता के लिए जो वस्तुओं को हटा रहा है द्वारा बनाया गया था -। जो काम करता है, तो उपसर्ग मैं IE इस्तेमाल किया Drop Table Schema1.blah)

+1

संकेत हो सकता है छोड़ने के साथ समस्याओं होने लगते हैं: sysschemas। वास्तव में: sys.schemas –

उत्तर

3
OBJECT_SCHEMA_NAME के साथ संयोजन में

उपयोग sys.objects अपने DROP TABLE बयान, समीक्षा का निर्माण करने के लिए, तो कॉपी/निष्पादित करने के लिए पेस्ट:

SELECT 'DROP TABLE ' + 
     QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
     QUOTENAME(name) + ';' 
    FROM sys.objects 
WHERE type_desc = 'USER_TABLE'; 

या sys.tables का उपयोग type_desc फिल्टर की जरूरत से बचने के लिए:

012,
SELECT 'DROP TABLE ' + 
     QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
     QUOTENAME(name) + ';' 
    FROM sys.tables; 

SQL Fiddle

+2

प्लस, SQL सर्वर ** 2005 ** और नए के रूप में, मैं 'sys.objects' से चयन करने के बजाय अधिक केंद्रित' sys.tables' दृश्य का उपयोग करने और 'type_desc प्रदान करने की अनुशंसा करता हूं '.... –

+1

@marc_s अच्छा बिंदु, 'sys.tables' – Bryan

+0

शामिल करने के लिए संपादित किया गया यह वही है जो मैं खोज रहा था, क्या यह मूल रूप से अनुशंसित sys.schemas जैसा ही है? केवल समस्या मैं भाग गया था, क्या मैं सभी वस्तुओं को छोड़ना चाहता था, और मैं कार्यों को छोड़कर सभी sys.table, sys.vew, आदि को खोजने में सक्षम था। लेकिन आपके पहले सुझाव ने इसके लिए ठीक काम किया। –

0

मैं Sql सर्वर का जो संस्करण पता नहीं है आप उपयोग कर रहे हैं, लेकिन यह सोचते हैं कि 2008 या बाद में, हो सकता है निम्न आदेश बहुत उपयोगी हो सकता है (जाँच लें कि आप एक साधारण में सभी तालिकाओं ड्रॉप कर सकते हैं लाइन):

sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?" 

यह स्क्रिप्ट डेटाबेस Database_Name से सभी तालिकाओं के लिए ड्रॉप टेबल .... निष्पादित करेंगे। बहुत आसान है और पूरी तरह से काम करता है।

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?" 
+1

'उपयोग' वर्तमान ** डेटाबेस ** को बदलता है, वर्तमान स्कीमा नहीं (मुझे यह भी सुनिश्चित नहीं है कि SQL सर्वर में * वर्तमान * स्कीमा की अवधारणा है) –

+0

@a_horse_with_no_name मेरी गलती क्षमा करें, मेरी पोस्ट को सही किया गया था। धन्यवाद। –

3

अन्य प्रश्न के न तो सभी वस्तुओं सवाल का भाग को संबोधित करने की कोशिश की है लगता है: के लिए अन्य एसक्यूएल निर्देशों पर अमल, उदाहरण के लिए यह आदेश इस्तेमाल किया जा सकता। मैं वहाँ की उम्मीद एक बूंद स्कीमा blah झरना होने के लिए -

मैं चकित आप इस के साथ अपने स्वयं रोल करने के लिए है हूँ। निश्चित रूप से प्रत्येक एकल व्यक्ति जो एक देव सर्वर सेट करता है उसे ऐसा करना होगा और सामान्य प्रोग्रामिंग करने में सक्षम होने से पहले कुछ मेटा-प्रोग्रामिंग करना गंभीर रूप से भयानक है। वैसे भी ... rant over!

मैंने इन लेखों में से कुछ को स्कीमा को साफ़ करके इसे करने के तरीके के रूप में देखना शुरू किया: ऐसा करने के बारे में old article है, हालांकि अब उल्लिखित सारणी marked as deprecated हैं। मैंने यहां क्या हो रहा है यह समझने में सहायता के लिए documentation for the new tables पर भी देखा है।

वहाँ another answer है और एक great dynamic sql resource यह से जोड़ता है।

कुछ समय के लिए यह सब सामान देखने के बाद यह सब थोड़ा गन्दा लग रहा था।

मुझे लगता है कि बेहतर विकल्प के लिए

ALTER DATABASE 'blah' SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
drop database 'blah' 

create database 'blah' 
बजाय

जाना है। शीर्ष पर अतिरिक्त अवशोषण मूल रूप से डेटाबेस को mentioned here

यह थोड़ा गलत लगता है लेकिन ड्रॉप स्क्रिप्ट लिखने में शामिल जटिलता की मात्रा मुझे लगता है कि इससे बचने का एक अच्छा कारण है।

वहाँ डेटाबेस मैं लिंक के कुछ फिर से मिलना और एक अन्य उत्तर पोस्ट

+0

ड्रॉप स्कीमा कैस्केड की कमी पर निश्चित रूप से आपसे सहमत हैं। इस जवाब ने मुझे खोज बंद करने के लिए आश्वस्त किया और इसके बजाय पूरे डेटाबेस को मिटा दें। – flodin

+0

@flodin हाँ पहले थोड़ा गलत महसूस किया लेकिन मैंने तब से पीछे नहीं देखा है। एसक्यूएल सर्वर में नए डेटाबेस बनाने के लिए यह एक महंगा ऑपरेशन नहीं है। मदद करने में खुशी हुई! –

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