Bạn chỉ nên thao tác trực tiếp danh mục hệ thống , nếu bạn biết chính xác những gì bạn đang làm. Nó có thể có tác dụng phụ không mong muốn. Hoặc bạn có thể làm hỏng cơ sở dữ liệu (hoặc toàn bộ cụm cơ sở dữ liệu) sau khi sửa chữa.
Câu trả lời của Jeremy , trong khi về cơ bản thực hiện mánh khóe, không được khuyến khích cho công chúng. Nó thay đổi vô điều kiện tất cả các chức năng trong một lược đồ. Bạn có chắc chắn không có chức năng hệ thống nào bị ảnh hưởng hoặc các chức năng được cài đặt bởi một mô-đun bổ sung không?
Việc thay đổi chủ sở hữu các chức năng đã thuộc về chủ sở hữu được chỉ định cũng là vô nghĩa.
Trước tiên, hãy kiểm tra nếu REASSIGN OWNED
có thể làm việc cho bạn:
thay đổi quyền sở hữu đối tượng cơ sở dữ liệu thuộc sở hữu của vai trò cơ sở dữ liệu
Bạn phải liệt kê tất cả các vai trò để bị từ chối rõ ràng. Nhưng nó cũng gán lại chức năng .
Để gán tất cả các hàm (và không có đối tượng nào khác) trong một lược đồ đã cho cho chủ sở hữu mới (tùy chọn bất kể chủ sở hữu trước đó):
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
Điều này tạo ra các lệnh SQL chuẩnALTER FUNCTION ...
để thay đổi tất cả các hàm (trong lược đồ đã chỉ định). Bạn có thể kiểm tra các lệnh trước khi thực hiện chúng - từng cái một hoặc tất cả cùng một lúc:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Tôi bao gồm một số WHERE
mệnh đề nhận xét mà bạn có thể muốn sử dụng để lọc kết quả.
Các diễn viên để regprocedure
tạo ra một tên hàm hợp lệ với các tham số, trích dẫn kép khi cần thiết, lược đồ - đủ điều kiện khi cần thiết cho hiện tại search_path
.
Hàm tổng hợp string_agg () yêu cầu PostgreSQL 9.0 trở lên. Trong phiên bản cũ thay thế bằng array_agg()
và array_to_string()
.
Bạn có thể đặt tất cả những điều này vào một DO
tuyên bố hoặc một chức năng như thể hiện trong câu trả lời liên quan này:
Trong Postgres 9.5 trở lên, bạn có thể đơn giản hóa truy vấn bằng cách sử dụng các loại định danh đối tượngregnamespace
regrole
mới và :
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
được thay thế trong pg 11. Ghi chú phát hành cho biết: Thay thế bảng hệ thốngpg_proc
'sproisagg
vàproiswindow
vớiprokind
(Peter Eisentraut) `