আপনি কীভাবে পোস্টগ্রাইএসকিউএল-এ কেবল পঠনযোগ্য ব্যবহারকারী তৈরি করবেন?


419

আমি PostgreSQL এ এমন একটি ব্যবহারকারী তৈরি করতে চাই যা কোনও নির্দিষ্ট ডাটাবেস থেকে কেবল নির্বাচন করতে পারে LECT মাইএসকিউএলে কমান্ডটি হ'ল:

GRANT SELECT ON mydb.* TO 'xxx'@'%' IDENTIFIED BY 'yyy';

পোস্টগ্রিসএসকিউএলে সমমানের কমান্ড বা কমান্ডের সিরিজটি কী?

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

postgres=# CREATE ROLE xxx LOGIN PASSWORD 'yyy';
postgres=# GRANT SELECT ON DATABASE mydb TO xxx;

তবে দেখা যাচ্ছে যে আপনি কেবলমাত্র একটি ডাটাবেসে মঞ্জুরি দিতে পারবেন সেগুলি হ'ল তৈরি, সংযোগ, গৃহশক্তি এবং টেম্প।

উত্তর:


641

ব্যবহারের অনুদান / একটি একক টেবিল নির্বাচন করুন

আপনি যদি কেবল একটি ডাটাবেসে সংযোগ প্রদান করেন তবে ব্যবহারকারী সংযোগ করতে পারবেন তবে অন্য কোনও সুযোগ-সুবিধা নেই। আপনাকে নেমস্পেসে (স্কিমা) ব্যবহার করতে হবে এবং আলাদা আলাদাভাবে টেবিলগুলি এবং দর্শনগুলিতে নির্বাচন করতে হবে:

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

একাধিক সারণী / দর্শন (পোস্টগ্রিএসকিউএল 9.0+)

পোস্টগ্রেএসকিউএল এর সর্বশেষতম সংস্করণগুলিতে, আপনি এক এক করে কমান্ডের পরিবর্তে একক কমান্ড ব্যবহার করে স্কিমায় সমস্ত টেবিল / ভিউ / ইত্যাদিতে অনুমতি দিতে পারেন:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

এটি কেবল ইতিমধ্যে তৈরি করা সারণীগুলিকে প্রভাবিত করে। আরও শক্তিশালীভাবে, আপনার ভবিষ্যতে নতুন অবজেক্টগুলিতে স্বয়ংক্রিয়ভাবে ডিফল্ট ভূমিকা থাকতে পারে :

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

নোট করুন যে ডিফল্টরূপে এটি কেবলমাত্র এই আদেশটি জারি করা ব্যবহারকারী দ্বারা তৈরি বস্তু (সারণী )গুলিকে প্রভাবিত করবে: যদিও এটি প্রদানকারী ব্যবহারকারীর সদস্য যে কোনও ভূমিকা নিয়ে সেটও করা যেতে পারে। যাইহোক, নতুন অবজেক্ট তৈরি করার সময় আপনি যে সদস্য হয়ে রয়েছেন সে সমস্ত ভূমিকার জন্য আপনি ডিফল্ট সুবিধাগুলি তুলবেন না ... তাই এখনও কিছুটা ত্রুটি রয়েছে। যদি আপনি এই পদ্ধতি অবলম্বন করেন যে কোনও ডাটাবেসের নিজস্ব ভূমিকা আছে এবং স্কিমা পরিবর্তনগুলি সেই মালিকানার ভূমিকা হিসাবে সম্পাদিত হয়, তবে আপনাকে সেই নিজস্ব ভূমিকার ক্ষেত্রে ডিফল্ট সুযোগ সুবিধা দেওয়া উচিত। আইএমএইচও এটি কিছুটা বিভ্রান্তিকর এবং একটি কার্যকরী ওয়ার্কফ্লো নিয়ে আসতে আপনাকে পরীক্ষার প্রয়োজন হতে পারে।

একাধিক সারণী / দর্শন (9.0 এর আগে পোস্টগ্রিএসকিউএল সংস্করণ)

দীর্ঘ, বহু-সারণী পরিবর্তনের ত্রুটিগুলি এড়ানোর GRANT SELECTজন্য, প্রতিটি টেবিল / ভিউতে প্রয়োজনীয় উত্পন্ন করতে নিম্নলিখিত 'স্বয়ংক্রিয়' প্রক্রিয়াটি ব্যবহার করার পরামর্শ দেওয়া হয় :

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

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


22
আপনার পোস্টটি শীর্ষে PG9 সম্পর্কিত আপনার সম্পাদনা করা উচিত।
ড্যানিলো বার্গেন

5
খুশী হলাম। একটি জিনিস আমি যুক্ত করব যে আপনি এই ব্যবহারকারী দ্বারা ক্রমগুলি পড়ার অনুমতিও দিতে পারে; সুতরাং: এক্সএক্সএক্সএইচএইচএমএ পাবলিকের সমস্ত সিকোয়েন্সে অনুদান নির্বাচন করুন;
জেজেসি

26
নোট করুন যে এই ব্যবহারকারীর নতুন টেবিল তৈরি করতে সক্ষম হওয়া থেকে বিরত রাখতে আমাকে করতে হয়েছিল REVOKE CREATE ON SCHEMA public FROM PUBLIC;। তা ছাড়া, "কেবল পঠনযোগ্য" ব্যবহারকারী বিদ্যমান টেবিলগুলিকে সংশোধন করতে পারে না, তবে স্কিমাতে নতুন টেবিল তৈরি করতে এবং সেই টেবিলগুলি থেকে ডেটা যুক্ত / সরিয়ে ফেলতে পারে।
আজেদী 32

3
@ আজেদী 32 এটি স্বীকৃত উত্তরের অংশ হওয়া উচিত! ধন্যবাদ
আসফান্দ কাজী

12
আমার মতো নবাগত শিশুদের জন্য আমি মনে করি এটি উল্লেখ করা উচিত যে আপনি psql mydbঅন্যথায় এই ম্যানিপুলেশনগুলি না করে ব্যবহার করে কনসোলটি শুরু করা উচিত । এটি ব্যক্তিগতভাবে আমার নিজের দ্বারা এটি বের করার জন্য যথেষ্ট পরিমাণ সময় নিয়েছিল। আশা করি এটি কাউকে সাহায্য করবে।
আনাস

41

মনে রাখবেন যে PostgreSQL 9.0 (আজ বিটা পরীক্ষায়) এর এটি করার একটি সহজ উপায় থাকবে :

test=> GRANT SELECT ON ALL TABLES IN SCHEMA public TO joeuser;

3
এটি কাজ করার জন্য আমাকে নির্দিষ্ট ডাটাবেসে থাকতে হয়েছিল। পোস্টগ্র্যাস্কল 9.5।
ব্যবহারকারী 1158559

8
এটি স্কিমাতে বিদ্যমান বিদ্যমান টেবিলগুলির জন্য কাজ করে। যদি পরে লেখার ব্যবহারকারী সারণী তৈরি করে বা প্রতিস্থাপন করে তবে কেবলমাত্র পঠনযোগ্য ব্যবহারকারী তাদের অ্যাক্সেস করতে পারবে না
এনিব

32

রেফারেন্স এই ব্লগ থেকে নেওয়া:

কেবল পঠনযোগ্য ব্যবহারকারী তৈরির স্ক্রিপ্ট:

CREATE ROLE Read_Only_User WITH LOGIN PASSWORD 'Test1234' 
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';

কেবলমাত্র এই পঠনযোগ্য ব্যবহারকারীর জন্য অনুমতি নির্ধারণ করুন:

GRANT CONNECT ON DATABASE YourDatabaseName TO Read_Only_User;
GRANT USAGE ON SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO Read_Only_User;

6
এটি একটি জিনিস হারিয়ে যাওয়া বাদে এটি একটি খুব ভাল উত্তর: ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User; যা ভবিষ্যতে একই ডিবিতে তৈরি সমস্ত টেবিল পড়তে দেয়।
রাববেকার

2
কেবল পাঠ্য ব্যবহারকারীকে সিকোয়েন্সগুলিতে অ্যাক্সেসের অনুমতি দেওয়া অস্বাভাবিক। ক্রমটি পড়া এটি আপডেট করে এবং এগুলি সাধারণত তাদের জন্য প্রয়োজন INSERT
jpmc26

সম্পূর্ণতার জন্য, সম্ভবত যুক্ত করুন:GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
ফ্যাবিয়েন হাদাদাদি

@ jpmc26: যে মানে কি আপনাকে সুপারিশ: GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User?
ফাবিয়েন হাদাদাদি

@ ফ্যাবিএনহাদাদাদি এর অর্থ হল যে আপনার যদি সাধারণ প্রয়োজনের কিছু না থাকে তবে আমি কেবলমাত্র পঠনযোগ্য ব্যবহারকারীকে সিক্যুয়েন্সে কোনও অনুমতি দেওয়ার প্রয়োজন দেখছি না।
jpmc26

24

কেবলমাত্র পঠনযোগ্য ব্যবহারকারীদের যোগ করার জন্য এখানে আমি সবচেয়ে ভাল উপায় খুঁজে পেয়েছি (পোস্টগ্রিসকিউএল 9.0 বা আরও নতুন ব্যবহার করে):

$ sudo -upostgres psql postgres
postgres=# CREATE ROLE readonly WITH LOGIN ENCRYPTED PASSWORD '<USE_A_NICE_STRONG_PASSWORD_PLEASE';
postgres=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

তারপরে সম্পর্কিত সমস্ত মেশিনে (মাস্টার + রিড-স্লেভ / গুলি) / হট-স্ট্যান্ডবাই (গুলি) ইত্যাদিতে লগ ইন করুন এবং চালান:

$ echo "hostssl <PUT_DBNAME_HERE> <PUT_READONLY_USERNAME_HERE> 0.0.0.0/0 md5" | sudo tee -a /etc/postgresql/9.2/main/pg_hba.conf
$ sudo service postgresql reload

2
আমি মতামতটি পছন্দ করি তবে আমার [তথ্যকার বা ভূমিকা] [দ্য ডাটাবেস] ডেটাবেসে কানেক্ট করা দরকার; এবং [ব্যবহারকারীর বা ভূমিকা] এর জন্য স্কেমার পাবলিকের উপর অনুদান ব্যবহার;
ইয়ান কনর

1
সর্বজনীন স্কিমা এখনও এই জাতীয় ব্যবহারকারীর টেবিল তৈরি করতে দেয়। এছাড়াও, নতুন টেবিলগুলি কভার করা হয়নি বা সিকোয়েন্সগুলিও নয়। দুর্ভাগ্যক্রমে, এটি এর চেয়ে অনেক বেশি জটিল। : - / আমি যা শেষ করেছি তা পোস্ট করব আমি একবার আরও কিছুকে যাচাই করেছি।
জেজেসি

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

আপনার যদি ইতিমধ্যে ব্যবহারকারী রয়েছে, কেবল পঠনযোগ্য ভূমিকা তৈরি করার পরে এবং নির্বাচিত
অনুমতিগুলি

18

ডিফল্টরূপে নতুন ব্যবহারকারীদের সারণী তৈরির অনুমতি থাকবে। আপনি যদি কেবল পঠনযোগ্য ব্যবহারকারী তৈরির পরিকল্পনা করেন তবে এটি সম্ভবত আপনি চান না।

পোস্টগ্র্রেএসকিউএল 9.0+ সহ সত্যই পঠনযোগ্য ব্যবহারকারী তৈরি করতে নিম্নলিখিত পদক্ষেপগুলি চালান:

# This will prevent default users from creating tables
REVOKE CREATE ON SCHEMA public FROM public;

# If you want to grant a write user permission to create tables
# note that superusers will always be able to create tables anyway
GRANT CREATE ON SCHEMA public to writeuser;

# Now create the read-only user
CREATE ROLE readonlyuser WITH LOGIN ENCRYPTED PASSWORD 'strongpassword';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;

যদি আপনার কেবলমাত্র পঠনযোগ্য ব্যবহারকারীর টেবিলগুলি তালিকাভুক্ত করার অনুমতি না থাকে (অর্থাত্ \dকোনও ফলাফল দেয় না) তবে এটি সম্ভবত আপনার USAGEজন্য স্কিমার অনুমতি নেই। USAGEএমন এক অনুমতি যা ব্যবহারকারীদের অর্পিত অনুমতিগুলি ব্যবহার করতে দেয়। এর মূল কথা কি? আমি নিশ্চিত নই. ঠিক করতে:

# You can either grant USAGE to everyone
GRANT USAGE ON SCHEMA public TO public;

# Or grant it just to your read only user
GRANT USAGE ON SCHEMA public TO readonlyuser;

8

আমি এটির জন্য একটি সুবিধাজনক স্ক্রিপ্ট তৈরি করেছি; pg_grant_read_to_db.sh । এই স্ক্রিপ্টটি একটি ডেটাবেস স্কিমাতে সমস্ত সারণী, দর্শন এবং অনুক্রমগুলিতে নির্দিষ্ট ভূমিকার জন্য কেবলমাত্র পঠনযোগ্য সুবিধাদি দেয় এবং সেগুলি ডিফল্ট হিসাবে সেট করে।


4

আমি ট্রাটটি সমস্ত সম্ভাব্য সমাধানগুলি পড়েছি, যা সব ঠিক আছে, যদি আপনি জিনিসগুলি দেওয়ার আগে ডাটাবেসে সংযোগ স্থাপনের কথা মনে রাখেন;) অন্য কোনও সমাধানের জন্য যাইহোক ধন্যবাদ !!!

user@server:~$ sudo su - postgres

পিএসকিএল ব্যবহারকারী তৈরি করুন:

postgres@server:~$ createuser --interactive 
Enter name of role to add: readonly
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

পিএসকিএল ক্লিপ শুরু করুন এবং তৈরি ব্যবহারকারীর জন্য একটি পাসওয়ার্ড সেট করুন:

postgres@server:~$ psql
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
Type "help" for help.

postgres=# alter user readonly with password 'readonly';
ALTER ROLE

লক্ষ্য ডাটাবেসের সাথে সংযোগ করুন:

postgres=# \c target_database 
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
You are now connected to database "target_database" as user "postgres".

সমস্ত প্রয়োজনীয় সুযোগসুবিধা প্রদান করুন:

target_database=# GRANT CONNECT ON DATABASE target_database TO readonly;
GRANT

target_database=# GRANT USAGE ON SCHEMA public TO readonly ;
GRANT

target_database=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly ;
GRANT

ডিবি পাবলিক শেমার জন্য ডিফল্ট সুবিধাগুলি পরিবর্তন করুন:

target_database=# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES

3

যদি আপনার ডাটাবেসটি সর্বজনীন স্কিমাতে থাকে তবে এটি সহজ (এটি ধরে নেওয়া হয় আপনি ইতিমধ্যে তৈরি করেছেন readonlyuser)

db=> GRANT SELECT ON ALL TABLES IN SCHEMA public to readonlyuser;
GRANT
db=> GRANT CONNECT ON DATABASE mydatabase to readonlyuser;
GRANT
db=> GRANT SELECT ON ALL SEQUENCES IN SCHEMA public to readonlyuser;
GRANT

যদি আপনার ডাটাবেস ব্যবহার করে থাকে customschemaতবে উপরেরটি প্রয়োগ করুন তবে আরও একটি কমান্ড যুক্ত করুন:

db=> ALTER USER readonlyuser SET search_path=customschema, public;
ALTER ROLE

1

এটি করার সহজবোধ্য উপায়টি ডাটাবেসের প্রতিটি টেবিলে মঞ্জুরি দেওয়া হবে:

postgres=# grant select on db_name.table_name to read_only_user;

ডাটাবেস মেটাডেটা থেকে আপনার অনুদানের বিবৃতি উত্পন্ন করে আপনি এটি স্বয়ংক্রিয় করতে পারেন।



0

দেশপেজের প্রতিক্রিয়াতে পোস্ট করা কোনও লিঙ্ক থেকে নেওয়া হয়েছে ' লিঙ্কের ।

Postgres 9.x অনুরোধ করা যা করার ক্ষমতা আছে বলে মনে হয়। এর গ্র্যান্ট অন ডাটাবেস অবজেক্টস অনুচ্ছেদ দেখুন:

http://www.postgresql.org/docs/current/interactive/sql-grant.html

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

এই পৃষ্ঠাটিতে রোলগুলির ব্যবহার এবং "সমস্ত ব্যক্তিগতকৃতকরণ" নামে পরিচিত একটি ব্যক্তিগত আলোচনাও করা হয়েছে।

গ্রান্ট কার্যকারিতা কীভাবে এসকিউএল স্ট্যান্ডার্ডের সাথে তুলনা করে সে সম্পর্কেও তথ্য উপস্থিত রয়েছে।

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