পোস্টগ্রেএসকিউএল দিয়ে ক্রস-ডাটাবেস প্রশ্নগুলি সম্পাদন করা সম্ভব?


143

আমি অনুমান করতে যাচ্ছি যে নীচের ত্রুটি বার্তার (এবং এই গুগলের ফলাফলের ভিত্তিতে) উত্তর "না" " ) এর , তবে পোস্টগ্র্রেএসকিউএল ব্যবহার করে কোনও ক্রস-ডাটাবেস কোয়েরি করার জন্য কি কোনও উপায় আছে?

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

আমি এমন কিছু ডেটা নিয়ে কাজ করছি যা দুটি ডাটাবেস জুড়ে বিভক্ত হয় যদিও তথ্য দুটির মধ্যে সত্যই ভাগ করা হয় (এক ডাটাবেসে ইউজারিড কলামগুলি usersঅন্য ডাটাবেসের টেবিল থেকে আসে )। এগুলি স্কিমার পরিবর্তে দুটি পৃথক ডাটাবেস কেন জানি না, তবে সি ল লা ভি ...

উত্তর:


111

দ্রষ্টব্য: মূল প্রশ্নকর্তা হিসাবে বোঝানো হয়েছে, আপনি যদি একই মেশিনে দুটি ডাটাবেস সেট আপ করে থাকেন তবে আপনি সম্ভবত তার পরিবর্তে দুটি স্কিমা বানাতে চান - সেক্ষেত্রে এগুলি জুড়ে জিজ্ঞাসা করার জন্য আপনার বিশেষ কোনও কিছুর প্রয়োজন নেই।

postgres_fdw

postgres_fdwস্থানীয় বা দূরবর্তী - কোনও পোস্টগ্রাস ডাটাবেসে টেবিলের সাথে সংযোগ করতে (বিদেশী ডেটা র‍্যাপার) ব্যবহার করুন ।

মনে রাখবেন যে অন্যান্য জনপ্রিয় ডেটা উত্সগুলির জন্য বিদেশী ডেটা র‌্যাপার রয়েছে । এই সময়ে, শুধুমাত্র postgres_fdwএবং file_fdwঅফিসিয়াল পোস্টগ্রিজ বিতরণের অংশ।

9.3 এর আগে পোস্টগ্রিজ সংস্করণগুলির জন্য

এই পুরানো সংস্করণগুলি আর সমর্থিত নয়, তবে আপনাকে যদি 2013-পূর্বের পোস্টগ্রিস ইনস্টলেশনতে এটি করতে হয়, তবে একটি ফাংশন বলে dblink

আমি এটি কখনও ব্যবহার করি নি, তবে এটি পোস্টগ্র্রেএসকিউএল এর সাথে বজায় রাখা এবং বিতরণ করা হয়। যদি আপনি পোস্টগ্র্রেএসকিউএল এর সংস্করণটি ব্যবহার করেন যা আপনার লিনাক্সের ডিস্ট্রো নিয়ে এসেছে, আপনার পোস্টগ্রেএসকিএল-অবদান নামে একটি প্যাকেজ ইনস্টল করতে হবে।


postgresql-contribআগে ইনস্টল করা দরকার dblink? বা postgresql-contribঅন্তর্ভুক্ত dblink? এবং তারপরে ওপি'র কোয়েরিটি কাজ করবে, না আপনার কি অন্যভাবে এটি জিজ্ঞাসা করতে হবে?
এমপেন

3
আমি যা পড়তে পারি, সেখান থেকে dblink আপনি এমন কোনও ক্যোয়ারী চান না যেখানে দুটি ডাটাবেস বিস্তৃত থাকে handle
পল টমবলিন

26

dblink () - একটি দূরবর্তী ডাটাবেসে একটি কোয়েরি কার্যকর করে

dblink একটি কোয়েরি কার্যকর করে (সাধারণত একটি নির্বাচন করুন, তবে এটি কোনও এসকিউএল বিবৃতি হতে পারে যা সারিগুলি ফেরত দেয়) দূরবর্তী ডাটাবেসে in

যখন দুটি পাঠ্য যুক্তি দেওয়া হয়, প্রথমে প্রথমে একটি অবিচ্ছিন্ন সংযোগের নাম হিসাবে দেখা হয়; যদি পাওয়া যায়, কমান্ডটি সেই সংযোগে কার্যকর করা হয়। যদি পাওয়া না যায় তবে প্রথম যুক্তিটি সংযুক্তি তথ্য স্ট্রিং হিসাবে 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
আপনি যদি কোনও মাইএসকিউএল পরিবেশ থেকে আসছেন তবে মাইএসকিউএল
ডাবল ডাটাবেসগুলি আসলেই

10

কেবল আরও কিছু তথ্য যুক্ত করতে।

বর্তমানের ডাটাবেস ব্যতীত অন্য কোনও ডাটাবেস অনুসন্ধানের উপায় নেই। পোস্টগ্র্রেএসকিউএল ডাটাবেস-নির্দিষ্ট সিস্টেম ক্যাটালগগুলি লোড করার কারণে, ক্রস-ডাটাবেস ক্যোয়ারী এমনকি কীভাবে আচরণ করা উচিত তা অনিশ্চিত।

কন্ট্রাক্ট / ডিবিলিঙ্ক ফাংশন কলগুলি ব্যবহার করে ক্রস-ডাটাবেস ক্যোয়ারিকে মঞ্জুরি দেয়। অবশ্যই, একটি ক্লায়েন্ট বিভিন্ন ডেটাবেজে একসাথে সংযোগ তৈরি করতে এবং ক্লায়েন্টের পাশেই ফলাফলগুলি মার্জ করতে পারে।

PostgreSQL FAQ


5
এই অ্যাডিটোনাল তথ্যটি বিভ্রান্তিকর হতে পারে এবং ব্যবহারকারীদের উপরের সমাধানটি ব্যবহার করতে নিরুৎসাহিত করতে পারে।
johan855

5

হ্যাঁ, আপনি ডিবিলিংক (কেবল পোস্টগ্রেসকিএল) এবং ডিবিআই-লিংক (বিদেশী ক্রস ডাটাবেস কোয়েরিয়ার অনুমতি দেয়) এবং টিডিএস_লিঙ্ক ব্যবহার করে যা এমএস এসকিউএল সার্ভারের বিপরীতে ক্যোয়ারী চালানোর অনুমতি দেয়।

আমি দুর্দান্ত সাফল্যের সাথে এর আগে ডিবি-লিংক এবং টিডিএস-লিঙ্ক ব্যবহার করেছি।


2

যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় এবং সর্বাধিক প্রশ্নগুলি কেবল পঠনযোগ্য হয় তবে আমি অন্য ডেটাবেসে ডেটা অনুলিপি করার পরামর্শ দেব। যদিও এটি ডেটার অপ্রয়োজনীয় সদৃশ বলে মনে হচ্ছে, সূচির প্রয়োজন হলে এটি সহায়তা করতে পারে।

এটি সরল অন ইনসার্ট ট্রিগার দিয়ে সম্পন্ন করা যেতে পারে যা অন্য কপিটি আপডেট করার জন্য ডব্লিংক কল করে। এছাড়াও পূর্ণ-বর্ধিত প্রতিলিপি অপশন রয়েছে (স্লোনির মতো) তবে এটি অফ-টপিক।


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

আমি dblink এবং postgres_fdw উভয়ই ব্যবহার করে 2 টি পৃথক ডাটাবেসে 2 টি টেবিলের মধ্যে একটি বিদেশী কী সম্পর্ক তৈরির চেষ্টা করেছি এবং ফলাফল নেই।

এ সম্পর্কে অন্যান্য লোকের প্রতিক্রিয়াগুলি পড়ে, উদাহরণস্বরূপ এখানে এবং এখানে এবং কিছু অন্যান্য উত্সে দেখে মনে হচ্ছে যে এটি করার কোনও উপায় নেই:

Dblink এবং postgres_fdw প্রকৃতপক্ষে অন্যান্য ডাটাবেস, যা মান Postgres সম্ভব নয় প্রয়োজন এবং কোয়েরি টেবিল সংযুক্ত হওয়ার জন্য এক সক্রিয়, কিন্তু তারা বিভিন্ন ডাটাবেস সারণির মধ্যে বিদেশী কী সম্পর্ক স্থাপন করতে অনুমতি দেয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.