একটি ডাটাবেসে সমস্ত স্কিমে গ্র্যান্ট ব্যবহার?


13

আমি GRANT USAGEএকটি প্রদত্ত ডাটাবেসের জন্য একজন ব্যবহারকারী / ভূমিকার কাছে যেতে চাই । ডাটাবেসটিতে অনেকগুলি স্কিমা রয়েছে।

আমি জানি একটি আছে ON ALL TABLES IN SCHEMA, তবে আমি "সমস্ত স্কিমা" চাই। আমি চেষ্টা করেছি GRANT USAGE .. ON DATABASE, তবে তা অবশ্যই ভুল (এটি আসলে বিদ্যমান নেই )।

এটি পোস্টগ্রিস 9.3 বা 9.4 এর জন্য, এটি এমন একটি সার্ভার হিসাবে ঘটে যা AWS আরডিএসে রয়েছে।

উত্তর:


18

আপনার কাছে কমপক্ষে দুটি বিকল্প রয়েছে।

প্রথমটি একটি ছোট ক্যোয়ারী এবং একটি পাঠ্য সম্পাদক ব্যবহার করে। আমাদের আগ্রহের স্কিমটা সংগ্রহ করতে হবে:

SELECT nspname
  FROM pg_namespace;

আপনি WHEREযদি সুযোগটি সীমাবদ্ধ করতে চান তবে আপনি একটি ধারা যুক্ত করতে পারেন। আউটপুটটি অনুলিপি করুন এবং এটি সংশোধন করুন, যাতে আপনি বেশ কয়েকটি GRANT USAGE ON SCHEMA ... TO your_role;কমান্ড পান। তারপরে এটি এটিকে খাওয়ান psql, উদাহরণস্বরূপ:

psql -f multigrant.sql

এর স্বাভাবিক রূপটি শেল স্ক্রিপ্ট হতে পারে যা সংগ্রহকৃত নাম এবং কলগুলির উপর লুপ করে psql, বিল্ডিং GRANTস্টেটমেন্টটি -cবিকল্পটিতে পাস করে ।

অন্য সমাধানটি একটি গতিশীল ক্যোয়ারী তৈরি করে একটি প্লা / পিএসএসকিএল ব্লকে মূলত একই কাজ করে। মূলটি একই - আমাদের স্কিমটা সংগ্রহ করতে হবে। তারপরে আমরা স্কিমার মাধ্যমে অনুমতিগুলি মঞ্জুরি দিয়ে তাদের সকলের উপর লুপ করব:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

দ্রষ্টব্য :

  • সারণী, সিকোয়েন্স, ফাংশন এবং প্রকারের থেকে আলাদা, কেউ স্কিমেটার (9.4 হিসাবে) জন্য ডিফল্ট সুবিধাগুলি সেট করতে পারে না । আপনাকে নতুনভাবে যুক্ত হওয়া যেকোন স্কিমার জন্য ম্যানুয়ালি এই অধিকারটি দিতে হবে।
  • ডায়নামিক ক্যোয়ারী তৈরি করার সময় আমি ডলার উদ্ধৃতি ব্যবহার করছি । উদাহরণস্বরূপ (এই উদাহরণটিতে উপস্থিত নেই) একক উদ্ধৃতিগুলি গুণনের বিপরীতে এটি আমাকে 'স্বাভাবিক' বাক্য গঠন ব্যবহার করতে দেয়। এইভাবে বেশিরভাগ সম্পাদক বিবৃতি সুন্দরভাবে তুলে ধরবেন।
  • আমিও ব্যবহার format()সঙ্গে %Iবিন্যাস সুনির্দিষ্টভাবে উল্লেখ করা বস্তুর নাম সঠিকভাবে প্রয়োজনে উদ্ধৃত আছে। স্ট্রিং ধ্রুবক এবং কিছু quote_ident()কলকে কনটেনটেশন দিয়ে ক্যোরি তৈরির চেয়ে এই পদ্ধতিরটি আরও বেশি পঠনযোগ্য ।
  • pg_namespacepg_catalogস্কিমা পাওয়া যাবে । সেখানে থাকা অন্য অবজেক্টগুলি দেখুন - তারা আপনার স্কিমা, টেবিল ইত্যাদির প্রতিটি দিক সঞ্চয় করে।

1
আমি অবাক হয়েছি আপনি grant usageনতুন স্কিমার জন্য স্বয়ংক্রিয়ভাবে চালিত ইভেন্ট ইভেন্ট ট্রিগার ব্যবহার করে নতুন তৈরি স্কিমার জন্য ডিফল্ট সুবিধাগুলি অনুকরণ করতে পারেন কিনা ।
a_horse_with_no_name

@a_horse_with_no_name এ সম্পর্কে চিন্তাভাবনা করে, আমি বর্তমানে এটি করা যায় না তার কোনও কারণ দেখছি।
dezso

0

আপনি খুব ব্যবহার করতে পারেন।

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.