দ্রুত এবং ময়লা
Postgres সালে 9.4+ ব্যবহার
SELECT to_regclass('foo');
অনুসন্ধানের পথে সনাক্তকারীকে পাওয়া না গেলে NULL ফেরত দেয়।
পোস্টগ্রিসে 9.3 বা তার বেশি বয়সীদের জন্য একটি কাস্টregclass
ব্যবহার করুন :
SELECT 'foo'::regclass;
এটি একটি ব্যতিক্রম উত্থাপন করে , যদি বস্তুটি খুঁজে পাওয়া যায় না!
যদি 'foo'
পাওয়া যায়, তবে oid
তার text
প্রতিনিধিত্ব করে ফেরত দেওয়া হয় । এটি কেবলমাত্র সারণীর নাম, বর্তমান অনুসন্ধানের পথ অনুসারে স্কিমা-যোগ্য এবং যেখানে প্রয়োজন সেখানে ডাবল-কোটেড।
যদি অবজেক্টটি না পাওয়া যায় তবে আপনি নিশ্চিত হতে পারেন যে এটি অনুসন্ধানের পথের কোথাও নেই or বা স্কিমি-যোগ্য নামের জন্য মোটেই নেই schema.foo
)
যদি এটি পাওয়া যায় তবে দুটি ত্রুটি রয়েছে :
অনুসন্ধানের অন্তর্নিহিত স্কিমের অন্তর্ভুক্ত search_path যেমন, pg_catalog
এবংpg_temp
। তবে আপনি নিজের উদ্দেশ্যে টেম্প এবং সিস্টেম সারণীগুলি বাদ দিতে চাইতে পারেন। (?)
regclass
সিস্টেম ক্যাটালগের সমস্ত অবজেক্টের জন্য কাজ করার জন্য একটি কাস্ট pg_class
: সূচি, ভিউ, সিকোয়েন্স ইত্যাদি কেবল সারণী নয়। আপনি একচেটিয়াভাবে একটি নিয়মিত টেবিল খুঁজছেন বলে মনে হচ্ছে। তবে একই নামের অন্যান্য বস্তুতেও সম্ভবত আপনার সমস্যা আছে। বিবরণ:
ধীর এবং নিশ্চিত
আমরা আপনার অনুসন্ধানে ফিরে এসেছি, তবে ব্যবহার করবেন না current_setting('search_path')
, যা খালি সেটিংটি দেয় returns ডেডিকেটেড সিস্টেম তথ্য ফাংশন ব্যবহার করুন current_schemas()
। প্রতি ডকুমেন্টেশন:
current_schemas(boolean)
name[]
অনুসন্ধানের পথে স্কিমার নামগুলি impচ্ছিকভাবে অন্তর্নিহিত স্কিমা সহ
"$user"
অনুসন্ধানের পথে চূড়ান্তভাবে সমাধান করা হয়। নামের সাথে কোনও স্কিমা SESSION_USER
উপস্থিত না থাকলে স্কিমাটি আরম্ভ করার জন্য ফিরে আসে না। এছাড়াও, আপনি ঠিক কী চান তার উপর নির্ভর করে, আপনি অতিরিক্তভাবে অন্তর্নিহিত স্কিমাগুলি ( pg_catalog
এবং সম্ভবত pg_temp
) আউটপুটও করতে পারেন - তবে আমি ধরে নিই যে আপনি হাতে থাকা মামলায় এইগুলি চান না, তাই ব্যবহার করুন:
DO
$do$
BEGIN
IF EXISTS (
SELECT -- list can be empty
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = ANY(current_schemas(FALSE))
AND n.nspname NOT LIKE 'pg_%' -- exclude system schemas!
AND c.relname = 'foo'
AND c.relkind = 'r') -- you probably need this
THEN
RAISE 'This application depends on tables created by another application';
END IF;
END
$do$;
এসকিউএল ফিডল , সর্বশেষDO
বিবৃতিব্যতীত সমস্ত প্রদর্শন করছে।
এসকিউএল ফিডল (জেডিবিসি) এর DO
সমাপ্তি অক্ষরযুক্ত বিবৃতিতে সমস্যা রয়েছে ।