DO
$do$
DECLARE
_schema text;
_sp
BEGIN
FOR _schema IN
SELECT quote_ident(nspname) -- prevent SQL injection
FROM pg_namespace n
WHERE nspname !~~ 'pg_%'
AND nspname <> 'information_schema'
LOOP
EXECUTE 'SET LOCAL search_path = ' || _schema;
ALTER TABLE product ADD COLUMN show_price boolean NOT NULL DEFAULT TRUE;
END LOOP;
END
$do$
आप सिस्टम कैटलॉग टेबल में प्रविष्टियों के माध्यम से एक DO
कथन
. 9.0 या बाद के संस्करण पोस्ट करना आवश्यक है .
आप एक फ़ंक्शन भी बना सकते हैं
. DO
कथन प्रक्रियात्मक भाषा plpgsql
का उपयोग करता है डिफ़ॉल्ट रूप से।
आपको केवल सिस्टम कैटलॉग की आवश्यकता है pg_namespace
, डेटाबेस के स्कीमा धारण करना। ज्ञात सिस्टम स्कीमा को छोड़कर सभी स्कीमा के माध्यम से लूप करें।
सुनिश्चित करें कि आप सही डेटाबेस से जुड़े हैं!
तालिका में एक शून्य नहीं
के साथ एक कॉलम जोड़ने के लिए बाधा, आपको नया कॉलम भरने के लिए एक डिफ़ॉल्ट मान भी प्रदान करना होगा। तार्किक रूप से असंभव अन्यथा। मैंने डिफ़ॉल्ट सत्य
जोड़ा है , अपनी आवश्यकताओं के अनुसार समायोजित करें।
सिस्टम कैटलॉग टेबल से ठीक से प्राप्त पहचानकर्ताओं को उद्धृत करके SQL इंजेक्शन से बचें। quote_ident()
इस मामले में। [और भी विकल्प हैं। देखें:
आपको गतिशील एसक्यूएल की आवश्यकता है। प्राथमिक "चाल" बस सेट करना है search_path
गतिशील रूप से, इसलिए एक ही कथन को बार-बार चलाया जा सकता है। SET LOCAL
का प्रभाव
लेन-देन के अंत तक रहता है। आप reSET search_path
. का उपयोग कर सकते हैं या पिछली स्थिति को सहेजें और इसे रीसेट करें यदि आपको इसके साथ एक ही लेनदेन में और अधिक करने की आवश्यकता है (संभावना नहीं):
SHOW search_path INTO _text_var;
...
EXECUTE 'SET search_path = ' || _text_var;