أنا مستخدم جديد لـ Postgres وأحاول ترحيل قواعد بيانات MySQL. في MySQL ، يمكنني منح امتيازات SELECT
و UPDATE
و INSERT
و DELETE
على مستخدم ذي امتياز منخفض وتمكين هذه المنح للتطبيق على جميع الجداول في قاعدة البيانات المحددة. يجب أن أفقد شيئًا في Postgres لأنه يبدو أنني مضطر إلى منح هذه الامتيازات لكل جدول على حدة. مع وجود العديد من قواعد البيانات ومئات الجداول لكل قاعدة بيانات تبدو مهمة شاقة فقط للخروج من على الأرض. بالإضافة إلى ذلك ، بمجرد تشغيل قاعدة البيانات ، تتم إضافة الجداول بشكل متكرر بما فيه الكفاية بحيث لا أرغب في منح الأذونات في كل مرة ما لم يكن ذلك ضروريًا للغاية.
كيف يتم إنجاز ذلك بشكل أفضل؟
أولاً ، يجب أن تكون قادرًا على الاتصال بقاعدة البيانات من أجل تشغيل الاستعلامات. يمكن تحقيق ذلك عن طريق
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
الذي تحتاجه.
بافتراض أنك تريد منحهم كل الامتيازات - افعل ذلك:
grant all privileges on database dbname to dbuser;
حيث dbname
هو اسم قاعدة البيانات الخاصة بك و dbuser
هو اسم المستخدم.
يتم منح جميع الامتيازات لجميع الجداول داخل قاعدة البيانات مع
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
ربما كنت أفعل شيئًا خاطئًا هنا لأنني جديد جدًا على 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;
--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;