PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Bỏ một vai trò với các đặc quyền

Chạy điều này trong mọi cơ sở dữ liệu của cùng một cụm nơi vai trò có thể sở hữu bất kỳ thứ gì hoặc có bất kỳ đặc quyền được cấp nào:

REASSIGN OWNED BY some_role_name TO postgres;
DROP OWNED BY some_role_name;

postgres là superuser mặc định, bạn có thể chọn bất kỳ cái nào khác. Nó sẽ sở hữu các đối tượng hiện thuộc sở hữu của vai trò cũ. Ngay sau khi ĐĂNG KÝ SỞ HỮU , không còn đối tượng nào được sở hữu bởi cùng một người dùng. Có vẻ không trực quan khi chạy DROP SỞ HỮU . Từ ngữ của lệnh gây hiểu lầm, vì nó cũng thu hồi tất cả các đặc quyền và đặc quyền mặc định cho vai trò trong cùng một cơ sở dữ liệu. Hướng dẫn:

Nhấn mạnh đậm của tôi.
Bạn vẫn phải thực thi nó trong mọi cơ sở dữ liệu đơn lẻ trong đó vai trò sở hữu bất kỳ thứ gì hoặc có bất kỳ đặc quyền nào được cấp. Hướng dẫn sử dụng:

Cuối cùng, chạy (một lần):

DROP role some_role_name;

Các vai trò được lưu trữ trong danh mục hệ thống toàn cụm, trong khi quyền sở hữu và đặc quyền trên các đối tượng được lưu trữ trong danh mục hệ thống cơ sở dữ liệu-cục bộ.

Giải thích chi tiết trong câu trả lời liên quan này:

Có một trang liên quan trong sổ tay hướng dẫn .

Tự động hóa hoàn toàn

Không có lệnh duy nhất để làm tất cả. Nhưng bạn có thể để Postgres tạo một tập lệnh psql hoàn chỉnh cho bạn.

Sự phụ thuộc cho các vai trò được lưu trữ trong danh mục hệ thống pg_shdepend :

Vì chúng tôi (có khả năng) cần kết nối với các cơ sở dữ liệu khác nhau, chúng tôi cần kết hợp các lệnh meta psql ( \ c my_database ) và các lệnh SQL DDL như hình trên. Tạo hàm này ở đâu đó trong cụm DB của bạn một lần:

CREATE OR REPLACE FUNCTION f_generate_ddl_to_remove_role(dead_role_walking regrole)
  RETURNS text
  LANGUAGE sql AS
$func$
SELECT concat_ws(
   E'\n'
 ,(SELECT string_agg(format(E'\\c %I\nREASSIGN OWNED BY %2$s TO postgres; DROP OWNED BY %2$s;'
                          , d.datname, dead_role_walking)
                   , E'\n')
   FROM  (
      SELECT DISTINCT dbid
      FROM   pg_shdepend
      WHERE  refobjid = dead_role_walking
      ) s
   JOIN   pg_database d ON d.oid = s.dbid)
 , format(E'DROP role %s;\n', dead_role_walking)
   )
$func$;

Gọi:

SELECT f_generate_ddl_to_remove_role('some_role_name');

Tạo một chuỗi như:

\c my_db1
REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
\c my_db2
REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
DROP role some_role_name;

Hoặc, nếu vai trò không sở hữu bất kỳ thứ gì và không có đặc quyền, chỉ cần:

DROP role some_role_name;

Nếu bạn cung cấp một tên vai trò không tồn tại, bạn sẽ gặp lỗi.

Sao chép chuỗi (không kèm theo dấu ngoặc kép) vào phiên psql được mở bằng siêu người dùng như postgres . Hoặc nối một tập lệnh bash với nó. Tất cả đã xong.

Có một số câu trả lời liên quan với giải thích thêm cho SQL động:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chạy tổng số bằng cách sử dụng hàm windows trong sql có cùng một kết quả cho cùng một dữ liệu

  2. Chỉ mục duy nhất trên các phân vùng postgresql

  3. Postgresql ltree truy vấn để tìm cha mẹ có hầu hết con cái; loại trừ gốc

  4. PostgreSQL:Làm cách nào để đặt search_path ở cấp người dùng?

  5. Có thể tồn tại hai bảng tạm thời có cùng tên trong các truy vấn riêng biệt không