it-swarm.asia

سرد امتيازات قاعدة البيانات باستخدام psql

أنا في منتصف عملية ترحيل خادم قاعدة البيانات ولا يمكنني معرفة (بعد البحث والبحث هنا) كيف يمكنني إدراج امتيازات قاعدة البيانات (أو جميع الامتيازات عبر الخادم) في PostgreSQL باستخدام psql أداة سطر الأوامر؟

أنا على Ubuntu 11.04 وإصدار PostgreSQL هو 8.2.x.

163
pedrosanta
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

المستندات على GRANT تقدم شرحًا لكيفية تفسير الناتج. للحصول على امتيازات محددة في جدول قاعدة البيانات الحالية ، استخدم \z myTable.

134
DrColossos

ربما تقصد سرد المستخدمين وامتيازاتهم لقاعدة بيانات - لا أستطيع أن أخبرك تمامًا من السؤال:

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB
126
Jack says try topanswers.xyz

يمكنك القيام بذلك باتباع:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

يمنحك هذا النوع من الإخراج:

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#
94
Himanshu Chauhan

باستخدام psql أوامر meta:

https://www.postgresql.org/docs/current/static/app-psql.html

عند الانتقال إلى الصفحة باستخدام Ctrl + F يعطيك:

\ddp [ pattern ] سرد إعدادات امتيازات الوصول الافتراضية.

\dp [ pattern ] سرد الجداول وطرق العرض والتسلسل مع امتيازات الوصول المرتبطة بها.

\l[+] [ pattern ] سرد قواعد البيانات في الخادم وإظهار .... امتيازات الوصول.

مذكور أيضًا أعلاه ، ولكن لم يتم العثور عليه مع امتيازات Word في صفحة الدليل:

\du+ للأدوار مع تسجيل الدخول و \dg+ للأدوار بدون - سيكون لها ملف "Member of" حيث تجد الأدوار الممنوحة للأدوار.

أتخطى امتيازات الوظيفة واللغة عن عمد هنا ، الموجود في psql اليدوي بالكاد يتم التلاعب به (وإذا كنت تستخدم هذه الامتيازات فلن تأتي هنا للحصول على نصيحة). نفس الشيء بالنسبة للأنواع والنطاقات التي يحددها المستخدم وما إلى ذلك - باستخدام "+" بعد الأمر التعريفي سيعرض لك الامتيازات إن وجدت.


هناك طريقة بسيطة للغاية للتحقق من الامتيازات وهي إسقاط المستخدم في المعاملة ، على سبيل المثال:

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms

عندما تكون القائمة أطول من N ، (على الأقل في 9.3) ، ينهار التحذير بقائمة الامتيازات ، ولكن لا يزال بإمكانك العثور عليها كاملة في السجلات ...

18
Vao Tsun

يستخدم psql الاستعلام الخوار عند إصدار \du أمر.

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
13
Dennis

أصبحت الخطوة الإضافية (التي قد تكون واضحة) هي مستخدم postgres ، وإلا فقد تحصل على أخطاء حول الأدوار غير الموجودة.

Sudo su - postgres
psql -l

أو

psql
postgres=> \l
10
Adam Shostack

هذا استعلامي يتكون من إجابات متعددة على هذا السؤال:

SELECT grantee AS user, CONCAT(table_schema, '.', table_name) AS table, 
    CASE 
        WHEN COUNT(privilege_type) = 7 THEN 'ALL'
        ELSE ARRAY_TO_STRING(ARRAY_AGG(privilege_type), ', ')
    END AS grants
FROM information_schema.role_table_grants
GROUP BY table_name, table_schema, grantee;

ينتج عن هذا شيء مثل هذا:

+------+--------------+----------------+
| user |    table     |     grants     |
+------+--------------+----------------+
| foo  | schema.table | ALL            |
| bar  | schema.table | SELECT, INSERT |
+------+--------------+----------------+
0
stefannienhuis