Làm cách nào để tách tất cả người dùng khác khỏi cơ sở dữ liệu postgres?


13

Tôi cần quyền truy cập độc quyền vào cơ sở dữ liệu. Có thể sử dụng lệnh SQL để "tách" tất cả người dùng khác khỏi cơ sở dữ liệu postgres. Hoặc có thể đóng tất cả các kết nối khác và sau đó có được quyền truy cập độc quyền.

Đây là để thử nghiệm đơn vị và các thử nghiệm chỉ được chạy thủ công, do đó không có nguy hiểm liên quan. Chỉ các kết nối chết cũ sẽ bị ảnh hưởng.

Không có người dùng khác kết nối với các cơ sở dữ liệu không đáng tin cậy này.

Các kết nối chết cũ đến từ phát triển. Điều này xảy ra mọi lúc khi một bài kiểm tra đang được viết hoặc thất bại không thoát sạch.


Nếu ai đó cũng cần phải khóa những người dùng khác trong một thời gian sau khi ngắt kết nối họ trong kịch bản sản xuất, hãy xem câu trả lời của Scott Marlowe bên dưới: /dba//a/6184/2024


Xem thêm câu hỏi tương tự này trên dba: Làm thế nào để thả tất cả các kết nối vào cơ sở dữ liệu cụ thể mà không dừng máy chủ?

Câu trả lời:


14

Bạn có thể thử kết nối với cơ sở dữ liệu với tư cách là người dùng postgres và đang chạy:

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( )
    );

cập nhật Một truy vấn thậm chí tốt hơn được thoát khỏi subselect:

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

2
đừng quên REVOKE các quyền CONNECT, nếu không, người dùng sẽ tạo các kết nối mới trước khi bạn có quyền truy cập độc quyền.
Frank Heikens

@Frank Heikens - Bắt tốt. Tôi đã nhập khóa "kiểm tra đơn vị thủ công" nhưng nếu có những người khác kết nối bên cạnh cá nhân thực hiện kiểm tra đơn vị thì "thu hồi kết nối trên <datname> từ ..." sẽ rất cần thiết.
gsiems

Trong PostgreQuery 9.2, procpidđã được đổi tên thành pid, vì vậy hãy coi chừng điều đó.
Craig Ringer

Ngoài việc thực hiện REVOKE với người dùng đang được đề cập đến, tôi còn phải REVOKE ..... công khai - một điều cần chú ý!
David N. Welton

vào ngày 9.3, dường như pg_stat_activity.procpid hiện được gọi là pg_stat_activity.pid . làm việc A-OK nếu không.
JL Peyret

4

Vấn đề ở đây là gấp đôi, đầu tiên bạn cần ngắt kết nối những người dùng đó và thứ hai bạn cần phải tránh họ ra khỏi máy chủ của bạn. Thay vì thu hồi các perm kết nối, tôi thường sử dụng pg_hba.conf để từ chối các kết nối mới từ một số máy và / hoặc người dùng nhất định, sau đó chỉ cần dừng nhanh pg_ctl -m; pg_ctl bắt đầu bỏ tất cả các kết nối hiện tại. Với việc thực hiện thay đổi DDL, điều này là khá cần thiết hoặc bạn sẽ gặp bế tắc ở mọi nơi.


5
Tôi luôn sử dụng một vai trò duy nhất cho phép CONNECT và được kế thừa bởi tất cả các vai trò khác. REVOKE kết nối cho vai trò duy nhất này và bạn đã hoàn thành. Bao bọc nó trong một hàm với pg_terminate_backend () và bạn có thể kiểm soát khi bạn phải dừng tất cả các kết nối hiện tại.
Frank Heikens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.