it-swarm.asia

منح حق الوصول إلى كافة الجداول للمستخدم

أنا مستخدم جديد لـ Postgres وأحاول ترحيل قواعد بيانات MySQL. في MySQL ، يمكنني منح امتيازات SELECT و UPDATE و INSERT و DELETE على مستخدم ذي امتياز منخفض وتمكين هذه المنح للتطبيق على جميع الجداول في قاعدة البيانات المحددة. يجب أن أفقد شيئًا في Postgres لأنه يبدو أنني مضطر إلى منح هذه الامتيازات لكل جدول على حدة. مع وجود العديد من قواعد البيانات ومئات الجداول لكل قاعدة بيانات تبدو مهمة شاقة فقط للخروج من على الأرض. بالإضافة إلى ذلك ، بمجرد تشغيل قاعدة البيانات ، تتم إضافة الجداول بشكل متكرر بما فيه الكفاية بحيث لا أرغب في منح الأذونات في كل مرة ما لم يكن ذلك ضروريًا للغاية.

كيف يتم إنجاز ذلك بشكل أفضل؟

158
PlaidFan

أولاً ، يجب أن تكون قادرًا على الاتصال بقاعدة البيانات من أجل تشغيل الاستعلامات. يمكن تحقيق ذلك عن طريق

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

REVOKE ضروري لأن

يشير مفتاح Word PUBLIC إلى أنه سيتم منح الامتيازات لجميع الأدوار ، بما في ذلك تلك التي قد يتم إنشاؤها لاحقًا. يمكن اعتبار PUBLIC كمجموعة محددة ضمنيًا تتضمن دائمًا جميع الأدوار. سيتم منح أي دور معين مجموع الامتيازات الممنوحة له مباشرة ، والامتيازات الممنوحة لأي دور هو حاليًا عضو فيه ، والامتيازات الممنوحة لـ PUBLIC.

إذا كنت ترغب حقًا في تقييد المستخدم على عبارات DML ، فلديك المزيد للقيام به:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

تفترض هذه أنه سيكون لديك مخطط واحد فقط (والذي يُسمى افتراضيًا "عام").

كما أشار جاك دوجلاس ، فإن ما ورد أعلاه يمنح فقط الامتيازات للجداول الموجودة الموجودة بالفعل . لتحقيق الشيء نفسه للجداول المستقبلية ، يجب عليك تحديد الامتيازات الافتراضية :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

هنا، some_role دور يقوم بإنشاء الجداول ، بينما user_name هو الذي يحصل على الامتيازات. لتحديد هذا ، يجب عليك تسجيل الدخول باسم some_role أو عضو منه.

وأخيرًا ، عليك أن تفعل الشيء نفسه بالنسبة للتسلسلات (بفضل PlaidFan لتوجيهها) - هنا هو امتياز USAGE الذي تحتاجه.

180
dezso

بافتراض أنك تريد منحهم كل الامتيازات - افعل ذلك:

grant all privileges on database dbname to dbuser;

حيث dbname هو اسم قاعدة البيانات الخاصة بك و dbuser هو اسم المستخدم.

54
alxkls

يتم منح جميع الامتيازات لجميع الجداول داخل قاعدة البيانات مع

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
22
Nomadme

ربما كنت أفعل شيئًا خاطئًا هنا لأنني جديد جدًا على PostgreSQL. لكن هذا لم يحل سوى الجزء الأول من المشكلة بالنسبة لي - تعيين الامتيازات على جميع الجداول الموجودة.

لكي يتم تعيين الأذونات بشكل صحيح لمستخدمي على الجداول الجديدة ، التي تم إنشاؤها ، يجب علي تعيين الأذونات الافتراضية للمستخدم:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;
18
Will
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
3
Jorge Valenzuela