কোনও ডিবিতে কোনও ব্যবহারকারীকে সমস্ত অনুমতি দিন


206

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

আমি চেষ্টা করেছিলাম:

grant ALL on database MY_DB to group MY_GROUP;

তবে এটি কোনও অনুমতি দেয় বলে মনে হয় না।

তারপরে আমি চেষ্টা করেছি:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

এবং মনে হচ্ছে আমাকে অবজেক্টগুলি তৈরি করার অনুমতি দিয়েছে তবে কোয়েরি করার নয় - অন্যান্য ব্যবহারকারীর অন্তর্ভুক্ত sche স্কিমায় থাকা অবজেক্টগুলি মুছুন

আমি MY_SCHEMA- তে ব্যবহারকারীকে USAGE অনুমতি দিয়ে যেতে পারতাম তবে তা টেবিলে অনুমতি না পাওয়ার বিষয়ে অভিযোগ করবে ...

সুতরাং আমি অনুমান করি আমার প্রশ্নটি: কোনও ডিবিতে কোনও ব্যবহারকারীর সমস্ত অনুমতি দেওয়ার কোনও সহজ উপায় আছে কি?

আমি পোস্টগ্রিজ এসকিউএল 8.1.23 এ কাজ করছি।

উত্তর:


271

ব্যবহারকারীর ডাটাবেস অ্যাক্সেস প্রয়োজন , স্পষ্টত:

GRANT CONNECT ON DATABASE my_db TO my_user;

এবং (অন্তত) USAGEউপর বিশেষাধিকার স্কিমা :

GRANT USAGE ON SCHEMA public TO my_user;

বা সমস্ত কাস্টম স্কিমার USAGEউপর অনুদান :

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

তারপরে, সমস্ত টেবিলের জন্য সমস্ত অনুমতি (পোস্টগ্রিস 9.0 বা তার পরে প্রয়োজন)।
এবং ক্রমগুলি ভুলে যাবেন না (যদি থাকে):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

জন্য পুরোনো সংস্করণগুলি আপনি pgAdmin তৃতীয় "গ্রান্ট উইজার্ড" (ডিফল্ট গুই) ব্যবহার করতে পারেন।

কিছু অন্যান্য অবজেক্ট রয়েছে, ম্যানুয়ালটিরGRANT পোস্টগ্রিস 12 হিসাবে সম্পূর্ণ তালিকা রয়েছে:

একটি ডাটাবেস অবজেক্টের সুবিধাগুলি (টেবিল, কলাম, দেখুন, বিদেশী টেবিল, সিক্যুয়েন্স, ডাটাবেস, বিদেশী-ডেটা র্যাপার, বিদেশী সার্ভার, ফাংশন, পদ্ধতি, পদ্ধতিগত ভাষা, স্কিমা বা টেবিল স্পেস)

তবে বাকি অংশ খুব কমই প্রয়োজন হয়। আরো বিস্তারিত:

বর্তমান সংস্করণে আপগ্রেড করার বিষয়টি বিবেচনা করুন ।


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
সমস্ত সুযোগ-সুবিধাগুলি প্রদান ON DATABASEশক্তিশালী মনে হয়, তবে এটি খুব বেশি করে না। এটা শুধু একটি শুরু। এটি থাকা বস্তুগুলিতে কোনও সুযোগ সুবিধা দেয় না।
এরউইন ব্র্যান্ডসেটেটার

49

PostgreSQL 9.0+ এ আপনি নিম্নলিখিতগুলি করবেন:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

আপনি যদি নতুন নির্মিত সম্পর্কের জন্যও এটি সক্ষম করতে চান তবে ডিফল্ট অনুমতিগুলি সেট করুন:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

তবে, আপনি 8.1 ব্যবহার করেছেন তা দেখে আপনার নিজের কোডিং করতে হবে:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

এটি সমস্ত সম্পর্কের উপর সুবিধাগুলি সেট করবে: সারণী, দর্শন, সূচী, অনুক্রম ইত্যাদি you আপনি যদি এটি সীমাবদ্ধ রাখতে চান তবে ফিল্টার করুন pg_class.relkind। বিশদ জানতে pg_class ডক্স দেখুন ।

আপনার প্রয়োগটি যেমন প্রয়োজন তত নিয়মিত আপনার এই ফাংশনটি চালানো উচিত। একটি বিকল্প হ'ল এটি ক্রোন চাকরিতে প্যাকেজ করা যা প্রতিদিন বা প্রতি ঘণ্টায় কার্যকর হয়।


হাই প্যাট্রিক, "সমস্ত টেবিলগুলি" 8.1-তে উপলব্ধ নয় ( postgresql.org/docs/8.1/static/sql-grant.html ) আমি জানি আমি টেবিলগুলি লুপ করে পৃথকভাবে অনুমতি দিতে পারতাম, তবে আমি এটিই এড়াতে চেষ্টা করছি। তবে আপনার সাহায্যের জন্য ধন্যবাদ
দিয়েগো

@ ডিগো: 8.1 এর জন্য সমাধান যুক্ত হয়েছে
প্যাট্রিক

ধন্যবাদ প্যাট্রিক, আমি আপনার মতো কিছু ব্যবহার করে শেষ করেছি তবে "গ্রান্ট সব" ব্যবহার করে না। কিছু কারণে এটি কিছু করার মনে হয় না। উদাহরণস্বরূপ, আমি দৌড়েছি: ব্যবহারকারীকে স্কিমা পরীক্ষায় সমস্ত মঞ্জুরি দিন; কিন্তু তার পরেও ইউজারএর স্কিমা পরীক্ষার টেবিলগুলি থেকে পড়ার অ্যাক্সেস নেই
ডিয়েগো

2
আপনার একটি স্কিমা ব্যবহারের জন্য অনুদান দেওয়া উচিত। তারপরে সেই স্কিমার মধ্যে থাকা সমস্ত সম্পর্কের (টেবিল, ভিউ, সিকোয়েন্সস, সূচিপত্রগুলি ইত্যাদি) আপনাকে আলাদা আলাদা আলাদা নির্বাচন, সংযোজন, আপডেট, মোছা, ট্রানসেট দিতে হবে। স্কিমাস হ'ল নামস্থান, সম্পর্কগুলি যেখানে আপনার ডেটা বসে।
প্যাট্রিক

28

পোস্টগ্র্রেএসকিউএল 9.4.15 ডাটাবেসে একটি ভূমিকা 'eSumit' যুক্ত করার জন্য এবং এই ভূমিকার সমস্ত অনুমতি দেওয়ার জন্য আমি নিম্নলিখিতটি করেছি:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

এর মাধ্যমে pg_table এন্টারগুলিও পরীক্ষা করে দেখেছে:

pg_roles থেকে * নির্বাচন করুন; এখানে চিত্র বর্ণনা লিখুন

ডাটাবেস অনুসন্ধানগুলি স্ন্যাপশট: এখানে চিত্র বর্ণনা লিখুন


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