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

Làm cách nào để thay đổi quyền sở hữu tất cả các đối tượng trong một lược đồ cụ thể trong PostgreSQL?

Có rất ít gợi ý ở đây (Cảm ơn), đã truyền cảm hứng cho tôi soạn một tập lệnh bash để thay đổi tất cả các đối tượng (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES) ​​ quyền sở hữu trong một lược đồ cụ thể trong một lần. Không có mã đặc biệt nào được bao gồm trong một tập lệnh, về cơ bản tôi đã chọn kỹ thuật được đề xuất và đơn giản hóa phương pháp triển khai thông qua tập lệnh. Trên thực tế, lệnh REASSIGN OWNED BY hầu hết hoạt động trơn tru, tuy nhiên, nó thay đổi quyền sở hữu đối tượng trên toàn cơ sở dữ liệu bất kể bất kỳ lược đồ nào. Hai trường hợp cuối cùng, trong đó bạn không thể sử dụng REASSIGN SỞ HỮU BỞI:

1. Nếu người dùng do nhầm lẫn tạo tất cả các đối tượng của mình bằng super-user (postgres) và sau đó có ý định thay đổi thành người dùng khác, thì REASSIGN OWNED BY sẽ không hoạt động và nó chỉ xảy ra lỗi như:

postgres=# reassign owned by postgres to user1;
ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system

2. Nếu người dùng chỉ muốn thay đổi một quyền sở hữu đối tượng giản đồ.

Trong các trường hợp thay đổi đối tượng, từ người dùng “postgres” sang người dùng khác hoặc chỉ thay đổi chỉ một đối tượng giản đồ, chúng tôi cần lặp qua từng đối tượng bằng cách thu thập chi tiết đối tượng từ &information_schema của pg_catalog và gọi ALTER TABLE / FUNCTION / AGGREGATE / TYPE vv

Tôi thích kỹ thuật tinh chỉnh đầu ra pg_dump bằng cách sử dụng các lệnh OS (sed / egrep), bởi vì về bản chất, pg_dump viết ALTER .. CHỦ SỞ HỮU của mọi đối tượng ( TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) trong đầu ra của nó. Việc bổ sung các câu lệnh đó từ pg_dump stdout bằng cách thay thế USER / SCHEMANAME mới bằng sed và sau đó chuyển lại các câu lệnh đó cho ứng dụng khách psql sẽ khắc phục sự cố ngay cả khi đối tượng thuộc sở hữu của người dùng Postgres. Tôi đã sử dụng phương pháp tương tự trong tập lệnh và cho phép người dùng chuyển TÊN NGƯỜI DÙNG MỚI và TÊN SCHEMA, vì vậy, để thay thế nó trong câu lệnh ALTER… OWNER TO ...

Sử dụng và xuất tập lệnh:

sh change_owner.sh  -n new_rolename -S schema_name

-bash-4.1$ sh change_owner.sh -n user1 -S public

Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2

Bạn có thể tải xuống tập lệnh từ đây và cũng có README để giúp bạn về cách sử dụ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. Lời khuyên khóa hoặc NOWAIT để tránh phải chờ các hàng bị khóa?

  2. Cách sử dụng pgBackRest để sao lưu PostgreSQL và TimescaleDB

  3. Triển khai thiết lập đa trung tâm dữ liệu cho PostgreSQL - Phần một

  4. Cập nhật mật khẩu PostgreSQL của bạn trong Linux

  5. Khắc phục “LỖI:mỗi truy vấn NGOẠI LỆ phải có cùng số cột” trong PostgreSQL