Phần thân của một hàm chỉ được lưu dưới dạng chuỗi . Không có danh sách các đối tượng được tham chiếu. (Chẳng hạn, khác với các khung nhìn, ví dụ, nơi các liên kết thực tế đến các bảng được tham chiếu được lưu.)
Truy vấn này cho Postgres 10 trở lên sử dụng chức năng thông tin danh mục hệ thốngpg_get_functiondef()
để xây dựng lại CREATE FUNCTION
tập lệnh cho các chức năng có liên quan và tìm kiếm tên bảng với biểu thức chính quy không phân biệt chữ hoa chữ thường:
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
Nó nên thực hiện công việc, nhưng rõ ràng nó không phải là chống đạn. Nó có thể thất bại đối với SQL động nơi tên bảng được tạo động và nó có thể trả về bất kỳ số dương nào sai - đặc biệt nếu tên bảng là một từ phổ biến.
Các hàm tổng hợp và tất cả các hàm từ các lược đồ hệ thống được loại trừ.
\m
và\M
đánh dấu bắt đầu và kết thúc của một từ trong cụm từ thông dụng.
Danh mục hệ thống pg_proc
đã thay đổi trong Postgres 11. proisagg
đã được thay thế bằng prokind
, các thủ tục lưu trữ thực sự đã được thêm vào. Bạn cần phải thích nghi. Liên quan:
EXECUTE
biểu thức như thế nào'mm_'||name_parameter
, và nó sẽ không đối phó chính xác với các tên được trích dẫn như"my""table""
hoặc gấp chữ hoa, nhưng nó sẽ làm hầu hết những gì hầu hết mọi người sẽ muốn .