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.