2011-08-10 25 views
43

मुझे फ्लाई पर स्कीमा बनाने, प्रबंधित करने और ड्रॉप करने की आवश्यकता है। यदि मैं पहले से मौजूद एक स्कीमा बनाने के लिए जाता हूं, तो मैं (सशर्त रूप से, बाहरी माध्यमों के माध्यम से) ड्रॉप करना चाहता हूं और इसे निर्दिष्ट के रूप में पुन: बनाना चाहता हूं। मैं अपने पोस्टग्रेस 9 सर्वर पर स्कीमा के अस्तित्व की जांच कैसे कर सकता हूं?पोस्टग्रेस्क्ल: जांचें कि क्या स्कीमा मौजूद है?

वर्तमान में, मैं यह कर रहा हूँ:

select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname'); 

लेकिन मुझे लगता है कि वहाँ शायद एक और तरीका है जैसे ... इस "उचित" को किसी खास स्कीमा के अस्तित्व के लिए Postgres क्वेरी करने के लिए है?

+9

भविष्य के आगंतुकों के लिए: आने वाले पोस्टग्रेस 9.3 में 'स्कीमा बनाएं यदि मौजूद नहीं है' –

उत्तर

66

निम्न क्वेरी आपको बता देंगे एक स्कीमा मौजूद है या नहीं।

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name'; 
+10

धन्यवाद, यह एक उत्कृष्ट जवाब था। यहां बताया गया है कि मैंने इसे अपनी आवश्यकताओं के लिए पूरी तरह से काम करने के लिए कैसे बढ़ाया: 'चयन मौजूद है (schema_name से info_schema.schemata चुनें schema_name =' foo '); ' –

+0

सी # में इसे कैसे जांचें? अगर मैं "ExecuteReader" का उपयोग करता हूं तो यह सभी प्रश्नों के लिए 1 दिखाता है। – Shesha

+0

सत्य या गलत वापस पाने के लिए ExecuteScalar का उपयोग करें। –

8

यह दृष्टिकोणों में से एक हो सकता है। पहले स्कीमा ड्रॉप करें और फिर इसे बनाएं।

IF EXISTS: 
Do not throw an error if the schema does not exist. A notice is issued in this case. 

तो,

DROP SCHEMA IF EXISTS schema_Name 
Create SCHEMA schema_Name 
+0

हाँ, लेकिन कहें कि मैं एक कदम रखना चाहता हूं? यानी SchemaXYZ मौजूद है? हाँ: क्या इसमें एक्स है? नहीं: ड्रॉप और बनाएं; हां: फ़ंक्शन –

+0

से बाहर निकलें उस समय के दौरान हमें चयन करना होगा (...)। मुझे एक ही आवश्यकता के साथ कुछ लिंक मिले। वे भी यही कहते हैं। :) http://postgresql.1045698.n5.nabble.com/query-for-schema-existence-and-create-chechema-in-jdbc-td3351491.html - PostgreSQL http://social.msdn.microsoft। कॉम/फ़ोरम/एन-यूएस/ट्रांजेक्टक्ल/थ्रेड/0 सी 64 एफ 2 सी -0 एडी 8-4एआई-बी 85 सी-17 बीबी 660 ए 154 ए --- एसक्यूएल सर्वर – Vinay

+0

यह सरल, छोटा और बिंदु है। अच्छा उत्तर। +1 – GeekyOmega

0

यदि आप एक विशेष योजना के अंतर्गत वस्तुओं (टेबल, sprocs, विचार) है उन लोगों में से कोई भी काम करेंगे - इसे छोड़ दौरान विफल होगा ...

बनाएं & प्रबंधित आसान हिस्सा है .. यह ड्रॉप है कि आप .. फिर भी, मैं नहीं एक उपयुक्त जवाब मिल सकता है मिल जाएगा, तो मैं दूसरों के लिए यहां पोस्ट ..

देखें लिंक यहाँ:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238a-305e-40d5-858e-0fbd70454810

+2

पोस्टग्रेज़ के लिए यह सही नहीं है। आपका उत्तर TransactSQL की बाधाओं का जिक्र कर रहा है, PostgreSQL नहीं। –

1

से(जोर मेरा अपना):

दृश्य स्कीमेता वर्तमान डेटाबेस है कि एक वर्तमान में सक्षम भूमिका के स्वामित्व में हैं के सभी स्कीमा में शामिल है।

तो अपने मूल समाधान/क्वेरी, पीटर की तुलना में अधिक विश्वसनीय यद्यपि गैर मानक है।

14

कुछ हद तक संबंधित और शायद सशर्त स्कीमा निर्माण की तलाश में दूसरों के हित में। मैंने अपने कुछ निर्माण स्क्रिप्ट में इस तरह के कोड का उपयोग करके पाया:

DO $$ 
BEGIN 

    IF NOT EXISTS(
     SELECT schema_name 
      FROM information_schema.schemata 
      WHERE schema_name = 'pgcrypto' 
    ) 
    THEN 
     EXECUTE 'CREATE SCHEMA pgcrypto'; 
    END IF; 

END 
$$; 
+0

यह अब तक का सबसे अच्छा समाधान है! :-) चित्रों का उपयोग करने के लिए – nagylzs

37

यदि आप कुल शुद्धवादी हैं या आप कुछ मिलीसेक प्राप्त करना चाहते हैं। मैं आपको पोस्टग्रेज़ देशी सिस्टम कैटलॉग का उपयोग करने की सलाह देता हूं। एक तो नेस्ट पाश जो pg_catalog वैसे भी बुला के कारण होता है से बच सकते हैं ...

SELECT EXISTS(SELECT 1 FROM information_schema.schemata 
       WHERE schema_name = 'name'); 

querying information_schema

आप सीधे pg_namespace क्वेरी करने हैं:

SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name'); 

प्लेनर के काम बहुत सरल है:

enter image description here

इसलिए आपका स्वयं का समाधान सबसे अच्छा था।

+2

+1 –

0

यह एक मेरे लिए काम किया (Postgres 9.3):

Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name') 
0

उपयोग

SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_namespace WHERE nspowner <> 1 AND nspname = 'schemaname'); 

, जैसा कि आप देख

दृश्य स्कीमेता में सभी स्कीमा शामिल आप https://www.postgresql.org/docs/current/static/infoschema-schemata.html जांच वर्तमान डेटाबेस कि वर्तमान उपयोगकर्ता के पास (बीई के माध्यम से) तक पहुंच है मालिक या कुछ विशेषाधिकार है)।

यह information_schema.schemata का उपयोग कर स्कीमा प्रदर्शित नहीं करता है कि वर्तमान उपयोगकर्ता का मालिक नहीं है या पर USAGE विशेषाधिकार नहीं है स्वीकार किए जाते हैं जवाब में क्वेरी का मतलब है।

SELECT 1 
FROM pg_catalog.pg_namespace 
WHERE nspowner <> 1 -- ignore tables made by postgres itself 
AND nspname = 'schemaname'; 

अधिक पूरा हो गया है और कहा कि postgres ही किया जाए या नहीं आप स्कीमा की पहुंच है की परवाह किए बिना नहीं किया सभी मौजूदा स्कीमा दिखाएगा।

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