ค้นหาวัตถุที่เชื่อมโยงกับบทบาท PostgreSQL


12

บางครั้งฉันสร้างผู้ใช้ PostgreSQL ชื่อuser1 (PostgreSQL 9.4.9)

ฉันต้องการจะลบผู้ใช้รายนี้ ดังนั้นฉันจะยกเลิกการอนุญาตทั้งหมดในตารางลำดับฟังก์ชันสิทธิ์เริ่มต้นและความเป็นเจ้าของด้วย:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;

REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;

REASSIGN OWNED BY user1 TO postgres;

อย่างไรก็ตามดูเหมือนว่าวัตถุหนึ่งยังคงเชื่อมโยงกับผู้ใช้นี้ใน 2 ฐานข้อมูล:

postgres=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database db1
1 object in database db2

มันดูเหมือนจะเป็นฟังก์ชั่น:

postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for function text(boolean)
1 object in database db2

แต่ฉันไม่สามารถระบุได้ว่าวัตถุใดเป็นเจ้าของหรือเกี่ยวข้องกับ user1

ถ้าฉันpg_dump -s db1 | grep user1ไม่ได้รับผลลัพธ์! มันอาจเป็นวัตถุระดับโลกหรือไม่

ฉันจะระบุวัตถุที่หายไปได้อย่างไร

ฉันรันคำสั่งในแต่ละฐานข้อมูล (db1 และ db2) ฉันไม่ต้องการวางวัตถุที่เป็นของuser1เพียงต้องการกำหนดใหม่หรือลบการให้สิทธิ์สำหรับผู้ใช้รายนี้

คำตอบ:


10

ตอบคำถามที่ถาม

วิธีค้นหาฟังก์ชันในข้อความแสดงข้อผิดพลาดและเจ้าของ:

SELECT oid::regprocedure AS function
     , pg_get_userbyid(proowner) AS owner
FROM   pg_proc
WHERE  oid = 'text(boolean)'::regprocedure;

ที่เกี่ยวข้อง:

ปัญหาที่แท้จริง

ข้อความแสดงข้อผิดพลาดแจ้งว่า:

DETAIL: สิทธิพิเศษสำหรับข้อความฟังก์ชั่น (บูลีน)

มันไม่ได้เกี่ยวกับการเป็นเจ้าของ แต่เกี่ยวกับสิทธิพิเศษ

คู่มือสำหรับDROP ROLE:

ก่อนที่จะวางบทบาทที่คุณจะต้องวางวัตถุทั้งหมดมันเป็นเจ้าของ (หรือโอนสิทธิการเป็นเจ้าของของพวกเขา) และยกเลิกสิทธิ์ใด ๆ บทบาทได้รับเกี่ยวกับวัตถุอื่น

และสำหรับALTER DEFAULT PRIVILEGES:

หากคุณต้องการที่จะลดบทบาทที่สิทธิพิเศษในการเริ่มต้นมีการเปลี่ยนแปลงก็เป็นสิ่งที่จำเป็นที่จะย้อนกลับการเปลี่ยนแปลงในสิทธิพิเศษในการเริ่มต้นหรือการใช้งานDROP OWNEDจำแนกตามการกำจัดของรายการสิทธิพิเศษในการเริ่มต้นสำหรับบทบาท

ดูเหมือนว่าคุณจะดำเนินการREASSIGN OWNEDในฐานข้อมูลเดียวเท่านั้น แต่คู่มือจะสั่ง:

เนื่องจากREASSIGN OWNEDไม่ส่งผลกระทบต่อวัตถุภายในฐานข้อมูลอื่นจึงจำเป็นต้องดำเนินการคำสั่งนี้ในแต่ละฐานข้อมูลที่มีวัตถุที่เป็นของบทบาทที่จะถูกลบ

เหมืองเน้นหนัก

และคุณถูก จำกัด IN SCHEMA publicด้วยคำสั่งของคุณ วางส่วนคำสั่งนั้นเพื่อกำหนดเป้าหมายฐานข้อมูลทั้งหมด แต่ไม่ต้องกังวลมี ...

วิธีง่ายๆด้วย DROP OWNED

REASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;

วัตถุของบทบาททั้งหมดเปลี่ยนความเป็นเจ้าของpostgresด้วยคำสั่งแรกและปลอดภัยในขณะนี้ ถ้อยคำของDROP OWNEDเป็นเรื่องที่ทำให้เข้าใจผิดเล็กน้อยเพราะมันยังกำจัดสิทธิ์ทั้งหมดและสิทธิ์เริ่มต้น คู่มือสำหรับDROP OWNED:

DROP OWNEDปล่อยวัตถุทั้งหมดภายในฐานข้อมูลปัจจุบันที่เป็นเจ้าของโดยหนึ่งในบทบาทที่ระบุ สิทธิ์ใด ๆ ที่มอบให้กับบทบาทที่กำหนดบนวัตถุในฐานข้อมูลปัจจุบันและบนวัตถุที่ใช้ร่วมกัน (ฐานข้อมูลพื้นที่ตาราง) จะถูกเพิกถอนด้วย

ทำซ้ำในฐานข้อมูลที่เกี่ยวข้องทั้งหมดจากนั้นคุณสามารถเข้ามาเพื่อฆ่า:

DROP ROLE user1;

6

แบบสอบถามด้านล่างแสดงรายการวัตถุกับเจ้าของ สำหรับสิทธิ์ทั้งหมดที่เราต้องการจริง ๆ

--r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
SELECT 
    n.nspname AS schema_name,
    c.relname AS rel_name,
    c.relkind AS rel_kind,
    pg_get_userbyid(c.relowner) AS owner_name
  FROM pg_class c
  JOIN pg_namespace n ON n.oid = c.relnamespace

UNION ALL

-- functions (or procedures)
SELECT
    n.nspname AS schema_name,
    p.proname,
    'p',
    pg_get_userbyid(p.proowner)
  FROM pg_proc p
  JOIN pg_namespace n ON n.oid = p.pronamespace

ฉันยังไม่พบวัตถุที่หายไปด้วยสิ่งนี้
Nicolas Payart

@NicolasPayart: คุณดำเนินการค้นหาในฐานข้อมูลที่ถูกต้องหรือไม่
Erwin Brandstetter

1

คุณต้องเชื่อมต่อกับฐานข้อมูลก่อน ในกรณีของคุณที่จะ

\c db1

และ

\c db2

จากนั้นลองเรียกใช้การเพิกถอนสิทธิ์ทั้งหมดและคำสั่งการโอนย้ายที่เป็นเจ้าของ / คำสั่ง DROP OWNED ที่เป็นเจ้าของอีกครั้ง


1
เฮ้ขอบคุณสำหรับคำตอบแรกของคุณ อย่างไรก็ตามก่อนโพสต์โปรดคิดว่าสิ่งนี้เพิ่มคำตอบที่มีอยู่และอธิบายสิ่งนี้ในคำตอบของคุณด้วย
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.