ฉันจะแยกผู้ใช้อื่นทั้งหมดออกจากฐานข้อมูล postgres ได้อย่างไร


13

ฉันต้องการการเข้าถึงฐานข้อมูลพิเศษ เป็นไปได้หรือไม่ที่ใช้คำสั่ง SQL เพื่อ "แยก" ผู้ใช้รายอื่นทั้งหมดจากฐานข้อมูล postgres หรืออาจปิดการเชื่อมต่ออื่น ๆ ทั้งหมดจากนั้นได้รับการเข้าถึงแบบเอกสิทธิ์

สำหรับการทดสอบหน่วยและการทดสอบนั้นจะดำเนินการด้วยตนเองเท่านั้นจึงไม่มีอันตรายใด ๆ เฉพาะการเชื่อมต่อที่ตายแล้วเท่านั้นที่จะได้รับผลกระทบ

ไม่มีผู้ใช้รายอื่นเชื่อมต่อกับฐานข้อมูลที่ไม่สำคัญที่สุดเหล่านี้

การเชื่อมต่อที่ตายแล้วมาจากการพัฒนา สิ่งนี้จะเกิดขึ้นตลอดเวลาเมื่อการทดสอบที่กำลังเขียนหรือล้มเหลวไม่ออกจากการทำความสะอาด


หากใครบางคนยังต้องปิดกั้นผู้ใช้คนอื่นอยู่ครู่หนึ่งหลังจากยกเลิกการเชื่อมต่อพวกเขาในสถานการณ์การผลิตดูคำตอบของ Scott Marlowe ด้านล่าง: /dba//a/6184/2024


ดูคำถามที่คล้ายกันนี้ใน dba: จะยกเลิกการเชื่อมต่อทั้งหมดไปยังฐานข้อมูลเฉพาะได้อย่างไรโดยไม่ต้องหยุดเซิร์ฟเวอร์

คำตอบ:


14

คุณสามารถลองเชื่อมต่อกับฐานข้อมูลเป็นผู้ใช้ postgres และทำงาน:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

อัปเดต การสืบค้นที่ดียิ่งขึ้นกำจัดการเลือกย่อย:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );

2
อย่าลืมยกเลิกการเชื่อมต่อการอนุญาตมิฉะนั้นผู้ใช้จะสร้างการเชื่อมต่อใหม่ก่อนที่คุณจะมีการเข้าถึงแบบเอกสิทธิ์
Frank Heikens

@ Frank Heikens - จับได้ดี ฉันได้ใส่คีย์ใน "การทดสอบหน่วยด้วยตนเอง" แต่ถ้ามีคนอื่นเชื่อมต่อนอกเหนือจากบุคคลที่ทำการทดสอบยูนิทแล้ว "ยกเลิกการเชื่อมต่อกับ <datname> จาก ... " จะเป็นสิ่งจำเป็น
gsiems

ใน PostgreSQL 9.2 procpidได้ถูกเปลี่ยนชื่อเป็นpidดังนั้นโปรดระวัง
Craig Ringer

นอกเหนือจากการเพิกถอนกับผู้ใช้ที่เป็นปัญหาฉันยังต้องเพิกถอน ..... สาธารณะ - สิ่งที่ต้องระวัง!
David N. Welton

บน 9.3 ดูเหมือนว่าpg_stat_activity.procpidเรียกว่าตอนนี้pg_stat_activity.pid ทำงาน A-OK เป็นอย่างอื่น
JL Peyret

4

ปัญหาที่นี่เป็นสองเท่าก่อนอื่นคุณต้องยกเลิกการเชื่อมต่อผู้ใช้เหล่านั้นและอันดับที่สองคุณต้องแยกพวกเขาออกจากเซิร์ฟเวอร์ของคุณ แทนที่จะเพิกถอนการเชื่อมต่อ perms ฉันมักจะใช้ pg_hba.conf เพื่อปฏิเสธการเชื่อมต่อใหม่จากเครื่องบางอย่างและ / หรือผู้ใช้จากนั้นเพียงทำ pg_ctl -m fast stop; pg_ctl เริ่มต้นเพื่อปล่อยการเชื่อมต่อปัจจุบันทั้งหมด ด้วย slony ที่ทำการเปลี่ยนแปลง DDL นี่เป็นสิ่งจำเป็นมากหรือคุณจะได้หยุดชะงักไปทุกที่


6
ฉันมักจะใช้บทบาทเดียวที่อนุญาตให้ CONNECT และรับบทบาทอื่น ๆ ทั้งหมด ยกเลิกการเชื่อมต่อสำหรับบทบาทเดียวนี้และคุณทำเสร็จแล้ว รวมไว้ในฟังก์ชั่นด้วย pg_terminate_backend () และคุณสามารถควบคุมได้เมื่อคุณต้องหยุดการเชื่อมต่อปัจจุบันทั้งหมด
Frank Heikens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.