পোস্টগ্রিএসকিউএল: নির্দিষ্ট সারণীতে অ্যাক্সেস করা সমস্ত সঞ্চিত ফাংশন কীভাবে তালিকাভুক্ত করা যায়


13

পরিচিতি:

অপ্রচলিত, ব্যবহৃত হয় না ইত্যাদি সহ বেশ কয়েকটি শতাধিক সঞ্চিত ফাংশন সহ পোস্টগ্রাইএসকিউএল ডাটাবেস

সমস্যা

টেবিল এক্সের সাথে আমার কোনও সঞ্চিত ফাংশন সন্ধান করা দরকার - আমি যেমন টেবিলের কাঠামোটি পরিবর্তন করতে চাই। তাদের মধ্যে কিছু ব্যবহার করা যেতে পারে না, সুতরাং আমি কেবল কোডটি দেখে এটি করতে পারি না।

আমার এটিএম থাকা সলিউশনটি পিএসএলএল \df+এবং গ্রেপিং আউটপুট চলছে , তবে আমি আরও ডেটাবেস-জাতীয় সমাধান পছন্দ করব, অর্থাত্ তথ্য স্কিমা ব্যবহার করে। এটি অবশ্যই পুনরাবৃত্তিযোগ্য কাজ হবে এবং আমি এটি সুন্দর এবং পরিষ্কার রাখতে চাই।

কোন পরামর্শ?

উত্তর:


18

কোনও ফাংশনের মূল অংশটি কেবল স্ট্রিং হিসাবে সংরক্ষণ করা হয় । রেফারেন্সযুক্ত বস্তুর কোনও তালিকা নেই। (এটি দর্শনগুলির চেয়ে পৃথক, উদাহরণস্বরূপ, যেখানে রেফারেন্সযুক্ত সারণীর প্রকৃত লিঙ্কগুলি সংরক্ষণ করা হয়))

পোস্টগ্রিস 10 বা তার বেশি বয়সীদের জন্য এই ক্যোয়ারী প্রাসঙ্গিক ফাংশনগুলির জন্য স্ক্রিপ্টটি পুনর্গঠন করতে সিস্টেম ক্যাটালগ তথ্য ফাংশনpg_get_functiondef()CREATE FUNCTION ব্যবহার করে এবং কেস-সংবেদনশীল নিয়মিত অভিব্যক্তি সহ টেবিলের নাম অনুসন্ধান করে:

SELECT n.nspname AS schema_name
     , p.proname AS function_name
     , pg_get_function_arguments(p.oid) AS args
     , pg_get_functiondef(p.oid) AS func_def
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  NOT p.proisagg
AND    n.nspname NOT LIKE 'pg_%'
AND    n.nspname <> 'information_schema'
AND    pg_get_functiondef(p.oid) ~* '\mbig\M';

এটি কাজটি করা উচিত, তবে এটি অবশ্যই বুলেট-প্রুফ নয়। এটি গতিশীল এসকিউএল-এর ক্ষেত্রে ব্যর্থ হতে পারে যেখানে টেবিলের নামটি গতিশীলভাবে উত্পন্ন হয় এবং এটি যে কোনও সংখ্যক মিথ্যা ধনাত্মককে ফিরিয়ে দিতে পারে - বিশেষত যদি টেবিলের নামটি একটি সাধারণ শব্দ is

সিস্টেম স্কিমা থেকে সমষ্টিগত কার্য এবং সমস্ত ফাংশন বাদ দেওয়া হয়েছে।

\mএবং\M নিয়মিত অভিব্যক্তিতে একটি শব্দের শুরু এবং শেষ চিহ্নিত করুন।

pg_procপোস্টগ্রিস ১১-এ পরিবর্তিত সিস্টেম ক্যাটালগটি proisaggপ্রতিস্থাপন করা হয়েছিল prokind, সত্যিকারের সঞ্চিত পদ্ধতি যুক্ত করা হয়েছিল। আপনার মানিয়ে নেওয়া দরকার। সম্পর্কিত:


1
হ্যাঁ ... এটি সম্পূর্ণ দৃust় নয়, এই অর্থে যে এটির EXECUTEমতো অভিব্যক্তি খুঁজে পাবে না 'mm_'||name_parameterএবং এটি উদ্ধৃত নামগুলির মতো "my""table""বা কেস-ভাঁজ সহ সঠিকভাবে মোকাবেলা করবে না , তবে এটি বেশিরভাগ মানুষ যা চায় তার বেশিরভাগ ক্ষেত্রেই করবে ।
ক্রেগ রিঞ্জার

@ ক্রেইগ্রিঞ্জার: হ্যাঁ, গতিময় প্রশ্নগুলি EXECUTEপ্রায় আবরণ করা অসম্ভব। তবে কেস-ভাঁজটি - বা অন্য কোনও কেস-সংবেদনশীল প্যাটার্ন-মিলের ~*পরিবর্তে আচ্ছাদিত হতে ~পারে।
এরউইন ব্র্যান্ডসেটেটার

যতক্ষণ অপারেটর প্রকৃতপক্ষে নামের সারণী তৈরি করতে যথেষ্ট পাগল না "MyTable"এবং MyTableকমপক্ষে ... এবং সত্যি বলতে, এটি একটি "ভাল, এটি অনুমোদিত হতে পারে তবে এটি স্মার্ট নয়" সরানো।
ক্রেগ রিঞ্জার 6

উত্তর করার জন্য ধন্যবাদ! আমি আসলে কোথাও গতিশীল টেবিলের নাম নির্মাণ ব্যবহার করি না এবং সমস্ত টেবিলের নাম ছোট হাতের অক্ষর।
সের্গে কুদরিয়াভসেভ

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