รายการสิทธิ์ของฐานข้อมูลโดยใช้ psql


142

ฉันอยู่ระหว่างการย้ายเซิร์ฟเวอร์ฐานข้อมูลและฉันไม่สามารถคิด (หลังจากค้นหาและค้นหาที่นี่) ฉันจะแสดงรายการสิทธิ์การใช้ฐานข้อมูล (หรือสิทธิ์ทั้งหมดบนเซิร์ฟเวอร์) บน PostgreSQL โดยใช้psqlเครื่องมือบรรทัดคำสั่งได้อย่างไร

ฉันใช้ Ubuntu 11.04 และรุ่น PostgreSQL ของฉันคือ 8.2.x

คำตอบ:


116
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สำหรับสิทธิพิเศษเฉพาะบนตารางของฐานข้อมูลปัจจุบันให้ใช้


5
\z myTableเหมาะสำหรับการตรวจสอบให้แน่ใจว่าคุณได้ให้สิทธิ์การเข้าถึงแก่ใครบางคนและหลีกเลี่ยงการดูเหมือนคนงี่เง่าเมื่อคุณพูดว่า "โอเคใช้งานได้ตอนนี้หรือไม่? "
ijoseph

107

บางทีคุณอาจหมายถึงรายชื่อผู้ใช้และสิทธิพิเศษสำหรับฐานข้อมูล - ฉันไม่สามารถบอกได้จากคำถาม:

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

ไม่ฉันต้องการวิธีที่จะแสดงรายการสิทธิ์ของฐานข้อมูลเฉพาะ แต่ฉันได้คิดออกแล้ว เจ้าของฐานข้อมูลมีสิทธิ์ทั้งหมดใช่ไหม และหลังจากนั้นเราสามารถเพิ่มสิทธิพิเศษเพิ่มเติมในฐานข้อมูลให้กับผู้ใช้ / กลุ่มอื่น ๆ สิ่งเหล่านี้ถูกแสดงรายการด้วยคำสั่ง \ l แต่ขอบคุณมากอยู่ดี
pedrosanta

80

คุณสามารถทำได้โดยทำตาม:

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=#

10
ยินดีต้อนรับสู่เว็บไซต์! คำถามเล็ก ๆ ข้อหนึ่ง: ทำไมคุณถึงใส่เอาท์พุตเป็นสกรีนช็อต โปรดใช้ข้อความปกติบ่อยที่สุดเท่าที่จะทำได้
dezso


1
มีวิธีที่ฉันสามารถดูการอนุญาตสำหรับลำดับหรือไม่ เพียงให้ข้อมูลตาราง
อยากรู้อยากเห็น

โปรดทราบว่า (อย่างน้อยที่สุดใน Postgres 9.4) ด้านบนจะไม่ทำงานสำหรับมุมมองที่ปรากฏ
SeldomNeedy

@HimanshuChauhan ถ้าฉันเพิ่มบทบาทใหม่ 'new_role' โดยใช้บทบาท 'mailreader' แล้ว information_schema.role_table_grants จะแสดงรายการ new_role ด้วยหรือไม่
อานันท์

15

ใช้psqlคำสั่ง meta:

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

การข้ามหน้าด้วย Ctrl + F ให้:

\ddp [ pattern ] แสดงการตั้งค่าสิทธิ์การเข้าถึงเริ่มต้น

\dp [ pattern ] แสดงตารางมุมมองและลำดับที่มีสิทธิ์การเข้าถึงที่เกี่ยวข้อง

\l[+] [ pattern ] แสดงรายการฐานข้อมูลในเซิร์ฟเวอร์และแสดงสิทธิ์การเข้าถึง ....

ดังกล่าวข้างต้น แต่ไม่พบด้วยคำว่า "สิทธิพิเศษ" ในหน้าคู่มือ:

\du+สำหรับบทบาทที่มีการเข้าสู่ระบบและ\dg+สำหรับบทบาทที่ไม่มี - จะมีการยื่น"Member of"ที่คุณค้นหาบทบาทที่มอบให้กับบทบาท

ฉันจงใจข้ามฟังก์ชั่นและสิทธิพิเศษทางภาษาที่นี่พบได้ในpsqlคู่มือว่าแทบจะไม่ได้รับการจัดการ (และถ้าคุณใช้สิทธิ์เหล่านั้นคุณจะไม่มาที่นี่เพื่อรับคำแนะนำ) เหมือนกันกับประเภทที่ผู้ใช้กำหนดโดเมนและอื่น ๆ - โดยใช้ "+" หลังจากคำสั่ง meta-command จะแสดงสิทธิ์ของคุณถ้ามี


วิธีที่รวดเร็วที่สุดในการตรวจสอบสิทธิพิเศษกำลังทำให้ผู้ใช้ตกอยู่ในธุรกรรมเช่น:

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) การเตือนด้วยรายการสิทธิ์จะถูกยุบ แต่คุณยังสามารถค้นหาได้เต็มในบันทึก ...


12

Undercovers 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;

SQL นี้เป็นมาตรฐานหรือไม่
ribamar

`" ข้อผิดพลาด: คอลัมน์ r.rolbypassrls ไม่มีอยู่ \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ", แต่น่าเสียดายที่ไม่สามารถใช้งานได้
ribamar

10

ขั้นตอนเพิ่มเติม (อาจชัดเจน) กลายเป็นผู้ใช้ postgres มิฉะนั้นคุณอาจได้รับข้อผิดพลาดเกี่ยวกับบทบาทที่ไม่มีอยู่

sudo su - postgres
psql -l

หรือ

psql
postgres=> \l

2
Meta: ฉันกำลังเพิ่มคำถามนี้เนื่องจากคำถามนี้ได้รับการจัดอันดับอย่างสูงในแบบสอบถาม Google "บทบาทรายการ postgres" และฉันใช้เวลาเล็กน้อยในการจัดอันดับผลลัพธ์ที่ต่ำกว่ามากก่อนที่ฉันจะพบสิ่งที่ฉันต้องการดังนั้นฉันจึงจดจำข้อมูลเพิ่มเติม
Adam Shostack

-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

เอาท์พุต

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.