PostgreSQL के साथ क्रॉस-डेटाबेस क्वेरी करना संभव है?


143

मैं यह अनुमान लगाने जा रहा हूं कि उत्तर "एरर" (नीचे दिए गए त्रुटि संदेश) और इस Google परिणाम के आधार पर "नहीं" है , लेकिन फिर भी PostgreSQL का उपयोग करके क्रॉस-डेटाबेस क्वेरी करने के लिए क्या है?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

मैं कुछ डेटा के साथ काम कर रहा हूं जो दो डेटाबेस में विभाजित हैं, हालांकि डेटा वास्तव में दोनों के बीच साझा किया जाता है (एक डेटाबेस में उपयोगकर्ता के कॉलम usersदूसरे डेटाबेस में टेबल से आते हैं )। मुझे नहीं पता कि ये स्कीमा के बजाय दो अलग-अलग डेटाबेस क्यों हैं, लेकिन c'est la vie ...

जवाबों:


111

नोट: जैसा कि मूल प्रश्नकर्ता ने कहा है, यदि आप एक ही मशीन पर दो डेटाबेस स्थापित कर रहे हैं, तो आप संभवतः इसके बजाय दो स्कीमा बनाना चाहते हैं - उस स्थिति में आपको उनके बीच क्वेरी करने के लिए कुछ विशेष करने की आवश्यकता नहीं है।

postgres_fdw

का प्रयोग करें postgres_fdw(विदेशी डेटा आवरण) किसी भी Postgres डेटाबेस में तालिकाओं के लिए कनेक्ट करने के लिए - स्थानीय या दूरदराज के।

ध्यान दें कि अन्य लोकप्रिय डेटा स्रोतों के लिए विदेशी डेटा रैपर हैं । इस समय, केवल postgres_fdwऔर file_fdwआधिकारिक पोस्टग्रेज वितरण का हिस्सा हैं।

9.3 से पहले पोस्टग्रैज वर्जन के लिए

इस पुराने संस्करण को अब समर्थित नहीं किया गया है, लेकिन यदि आपको 2013 के पूर्व स्थापना में ऐसा करने की आवश्यकता है, तो एक फ़ंक्शन है जिसे कहा जाता है dblink

मैंने इसका कभी उपयोग नहीं किया है, लेकिन इसे पोस्टग्रेक्यूएल के बाकी हिस्सों के साथ बनाए रखा और वितरित किया गया है। यदि आप अपने लिनक्स डिस्ट्रो के साथ आने वाले PostgreSQL के संस्करण का उपयोग कर रहे हैं, तो आपको postgresql-contrib नामक पैकेज स्थापित करने की आवश्यकता हो सकती है।


postgresql-contribपहले स्थापित करने की आवश्यकता है dblink? या postgresql-contribशामिल हैं dblink? और फिर ओपी की क्वेरी काम करेगी, या क्या आपको इसे अलग तरीके से क्वेरी करना है?
मपेन

3
मैं जो पढ़ सकता हूं, उससे उस मामले को संभालना नहीं चाहिए जहां आप एक क्वेरी चाहते हैं जो दो डेटाबेस तक फैला हो।
पॉल टॉम्बलिन

26

dblink () - किसी दूरस्थ डेटाबेस में एक क्वेरी निष्पादित करता है

dblink क्वेरी को निष्पादित करता है (आमतौर पर एक SELECT, लेकिन यह किसी भी SQL स्टेटमेंट का हो सकता है जो पंक्तियों को लौटाता है) रिमोट डेटाबेस में।

जब दो पाठ तर्क दिए जाते हैं, तो पहले एक को लगातार कनेक्शन के नाम के रूप में देखा जाता है; यदि पाया जाता है, तो उस कनेक्शन पर कमांड निष्पादित की जाती है। यदि नहीं मिला है, तो पहले तर्क को कनेक्शन जानकारी स्ट्रिंग के रूप में dblink_connect के लिए माना जाता है, और संकेतित कनेक्शन केवल इस कमांड की अवधि के लिए बनाया गया है।

अच्छे उदाहरणों में से एक:

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

नोट: मैं भविष्य में संदर्भ के लिए यह जानकारी दे रहा हूं। refrence


21

आप के रूप में क्रॉस डेटाबेस प्रश्नों के बारे में एक ही निष्कर्ष पर आने से पहले मैंने इसे चलाया है। मैंने जो कुछ किया वह टेबल स्पेस को विभाजित करने के लिए स्कीमा का उपयोग कर रहा था जिस तरह से मैं टेबल को समूहीकृत कर सकता था लेकिन फिर भी उन सभी को क्वेरी कर सकता था।


17
यदि आप एक MySQL वातावरण से आ रहे हैं, तो MySQL कॉल डेटाबेस वास्तव में स्कीमा क्या हैं (
क्रीएट

10

बस थोड़ी और जानकारी जोड़ने के लिए।

वर्तमान डेटाबेस के अलावा किसी डेटाबेस को क्वेरी करने का कोई तरीका नहीं है। क्योंकि PostgreSQL डेटाबेस-विशिष्ट सिस्टम कैटलॉग को लोड करता है, यह अनिश्चित है कि क्रॉस-डेटाबेस क्वेरी को कैसे व्यवहार करना चाहिए।

contrib / dblink फ़ंक्शन कॉल का उपयोग करके क्रॉस-डेटाबेस प्रश्नों की अनुमति देता है। बेशक, एक क्लाइंट विभिन्न डेटाबेस में एक साथ कनेक्शन भी बना सकता है और क्लाइंट साइड पर परिणाम मर्ज कर सकता है।

PostgreSQL FAQ


5
यह अतिरिक्त जानकारी भ्रामक हो सकती है और उपर्युक्त समाधान का उपयोग करने के लिए उपयोगकर्ताओं को हतोत्साहित कर सकती है।
johan855

5

हां, आप डीबीलिंक (केवल पोस्टग्रैक्स्ल) और डीबीआई-लिंक (विदेशी क्रॉस डेटाबेस क्वैरीज़ की अनुमति देता है) और TDS_LInk का उपयोग करके कर सकते हैं, जो एमएस SQL ​​सर्वर के खिलाफ प्रश्नों को चलाने की अनुमति देता है।

मैंने बड़ी सफलता से पहले DB-Link और TDS- लिंक का उपयोग किया है।


2

यदि प्रदर्शन महत्वपूर्ण है और अधिकांश क्वेरीज़ केवल पढ़ने के लिए हैं, तो मैं किसी अन्य डेटाबेस पर डेटा को दोहराने का सुझाव दूंगा। हालांकि यह डेटा के अनावश्यक नकल जैसा लगता है, अगर इंडेक्स की आवश्यकता होती है तो यह मदद कर सकता है।

यह सम्मिलित ट्रिगर्स पर सरल के साथ किया जा सकता है जो बदले में दूसरी कॉपी को अपडेट करने के लिए कॉल करता है। पूर्ण-विकसित प्रतिकृति विकल्प (जैसे Slony) भी हैं, लेकिन यह ऑफ-टॉपिक है।


2

यदि किसी को क्रॉस-डेटाबेस क्वेरीज़ करने के बारे में अधिक सम्मिलित उदाहरण की आवश्यकता है, तो यहां एक उदाहरण है जो databasechangeloglockहर डेटाबेस पर तालिका को साफ करता है:

CREATE EXTENSION IF NOT EXISTS dblink;

DO 
$$
DECLARE database_name TEXT;
DECLARE conn_template TEXT;
DECLARE conn_string TEXT;
DECLARE table_exists Boolean;
BEGIN
    conn_template = 'user=myuser password=mypass dbname=';

    FOR database_name IN
        SELECT datname FROM pg_database
        WHERE datistemplate = false
    LOOP
        conn_string = conn_template || database_name;

        table_exists = (select table_exists_ from dblink(conn_string, '(select Count(*) > 0 from information_schema.tables where table_name = ''databasechangeloglock'')') as (table_exists_ Boolean));
        IF table_exists THEN
            perform dblink_exec(conn_string, 'delete from databasechangeloglock');
        END IF;     
    END LOOP;

END
$$

1

मैंने चेक किया है और दो अलग-अलग डेटाबेस में 2 टेबल के बीच एक विदेशी कुंजी संबंध बनाने की कोशिश की है, दोनों dblink और postgres_fdw का उपयोग करते हुए, लेकिन कोई परिणाम नहीं मिला।

इस पर अन्य लोगों के फीडबैक को पढ़ने के बाद, उदाहरण के लिए यहाँ और यहाँ और कुछ अन्य स्रोतों में ऐसा लगता है कि ऐसा करने का कोई तरीका नहीं है:

Dblink और postgres_fdw वास्तव में अन्य डेटाबेस है, जो मानक Postgres साथ संभव नहीं है में करने के लिए और क्वेरी टेबल कनेक्ट करने के लिए एक सक्षम है, लेकिन वे अलग डेटाबेस में तालिकाओं के बीच विदेशी कुंजी संबंधों को स्थापित करने की अनुमति नहीं देते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.