Truy vấn cơ bản
Truy vấn này tạo tất cả các câu lệnh DDL cần thiết:
SELECT 'DROP FUNCTION ' || oid::regprocedure
FROM pg_proc
WHERE proname = 'my_function_name' -- name without schema-qualification
AND pg_function_is_visible(oid); -- restrict to current search_path
Đầu ra:
DROP FUNCTION my_function_name(string text, form text, maxlen integer);
DROP FUNCTION my_function_name(string text, form text);
DROP FUNCTION my_function_name(string text);
Thực hiện các lệnh sau khi kiểm tra tính hợp lý.
Chuyển tên hàm phân biệt chữ hoa chữ thường và không thêm dấu ngoặc kép để khớp với pg_proc.proname
.
Truyền tới loại định danh đối tượng regprocedure
( oid::regprocedure
), rồi đến text
ngầm định, tạo ra các tên hàm với các loại đối số, tự động được trích dẫn kép và đủ điều kiện giản đồ theo search_path
hiện tại Khi cần thiết. Không đưa vào SQL có thể.
pg_function_is_visible(oid)
giới hạn lựa chọn đối với các chức năng trong search_path
hiện tại ("có thể nhìn thấy"). Bạn có thể muốn hoặc không muốn điều này.
Nếu bạn có nhiều hàm cùng tên trong nhiều lược đồ hoặc các hàm được nạp chồng với các đối số hàm khác nhau, tất cả trong số đó sẽ được liệt kê riêng. Bạn có thể muốn hạn chế đối với (các) lược đồ cụ thể hoặc (các) tham số hàm cụ thể.
Có liên quan:
- Khi nào / như thế nào thì các hàm biểu thức giá trị mặc định bị ràng buộc liên quan đến đường dẫn tìm kiếm?
Chức năng
Bạn có thể tạo plpgsql
chức năng xung quanh điều này để thực thi các câu lệnh ngay lập tức với EXECUTE
. Đối với Postgres 9.1 hoặc sau này: Cẩn thận! Nó làm giảm các chức năng của bạn!
CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT functions_dropped int)
LANGUAGE plpgsql AS
$func$
-- drop all functions with given _name in the current search_path, regardless of function parameters
DECLARE
_sql text;
BEGIN
SELECT count(*)::int
, 'DROP FUNCTION ' || string_agg(oid::regprocedure::text, '; DROP FUNCTION ')
FROM pg_catalog.pg_proc
WHERE proname = _name
AND pg_function_is_visible(oid) -- restrict to current search_path
INTO functions_dropped, _sql; -- count only returned if subsequent DROPs succeed
IF functions_dropped > 0 THEN -- only if function(s) found
EXECUTE _sql;
END IF;
END
$func$;
Gọi:
SELECT f_delfunc('my_function_name');
Hàm trả về số lượng hàm được tìm thấy và bị loại bỏ nếu không có ngoại lệ nào được nêu ra. 0
nếu không tìm thấy.
Đọc thêm:
- Cách search_path ảnh hưởng đến độ phân giải của mã định danh và "giản đồ hiện tại"
- Cắt bớt tất cả các bảng trong cơ sở dữ liệu Postgres
- Thứ tự theo / giới hạn được tham số hóa PostgreSQL trong hàm bảng
Đối với các phiên bản Postgres cũ hơn 9.1 hoặc các biến thể cũ hơn của hàm bằng cách sử dụng regproc
và pg_get_function_identity_arguments(oid)
kiểm tra lịch sử chỉnh sửa của câu trả lời này.