Giả sử bạn biết đó là một hàm kích hoạt (tức là RETURNS TRIGGER
), điều này nên làm điều đó:
SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc
Nếu func1
quá tải, bạn sẽ cần sử dụng ví dụ:tgfoid = 'func1(text,text)'::regprocedure
.
Nhưng nói chung, nó cũng có thể xuất hiện trong pg_aggregate
hoặc pg_cast
, hoặc trong một định nghĩa chế độ xem, hoặc một ràng buộc kiểm tra, hoặc một tá vị trí khác và bạn không muốn phải kiểm tra tất cả chúng.
Bạn có thể tìm hiểu phần cuối của vấn đề này qua pg_depend
, theo dõi tất cả các phụ thuộc đối tượng trong cơ sở dữ liệu. Ví dụ:
SELECT classid::regclass
FROM pg_depend
WHERE refobjid = 'func1'::regproc
Nếu điều này trả về, ví dụ: pg_attrdef
, sau đó bạn biết nó được sử dụng trong một cột mặc định. Các trường khác trong pg_depend
sẽ cho bạn biết chính xác đó là bảng / cột nào. Lưu ý rằng lệnh gọi từ một hàm khác không được coi là phụ thuộc, vì vậy bạn vẫn cần kiểm tra pg_proc.prosrc
.
Nhưng có một cách đơn giản hơn để theo dõi phần lớn các phụ thuộc:
BEGIN;
DROP FUNCTION func1();
ROLLBACK;
Nếu func1
đang được sử dụng, DROP
sẽ (có thể) không thành công và lỗi sẽ cho bạn biết chính xác vị trí.
Thậm chí còn dễ dàng hơn, nếu bạn có một shell tiện dụng:Chỉ cần chạy pg_dump --schema-only
và xem func1
ở đâu xuất hiện.