Dưới đây là ba ví dụ về việc trả về danh sách các thủ tục được lưu trữ tham chiếu đến một bảng cụ thể trong PostgreSQL.
information_schema.routines
Xem
Chúng tôi có thể truy vấn information_schema.routines
xem có định nghĩa nào chứa tên bảng không.
Ví dụ:
SELECT
routine_name,
routine_body,
routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';
Trong ví dụ này, tôi đã kiểm tra xem có bất kỳ thủ tục nào được lưu trữ có văn bản artists
không trong định nghĩa của họ.
ILIKE
toán tử làm cho đối sánh không phân biệt chữ hoa chữ thường theo ngôn ngữ hoạt động. Đây là một tiện ích mở rộng PostgreSQL và nó không phải là một phần của tiêu chuẩn SQL. Đối với đối sánh phân biệt chữ hoa chữ thường, hãy sử dụng LIKE
.
Lưu ý rằng nó không hoàn hảo, theo nghĩa là nó có thể trả về kết quả dương tính giả nếu văn bản nằm trong quy trình, nhưng nó không phải là một bảng. Để giảm thiểu rủi ro này, có lẽ bạn có thể tinh chỉnh các tiêu chí bộ lọc.
pg_proc
Danh mục
pg_catalog.pg_proc
danh mục lưu trữ thông tin về chức năng, thủ tục, chức năng tổng hợp và chức năng cửa sổ. Do đó, chúng tôi có thể truy vấn như sau:
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
p.prosrc AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';
Trong trường hợp này, chúng tôi kết hợp danh mục với pg_catalog.pg_namespace
danh mục để lọc kết quả thành chỉ các thủ tục có public
không gian tên.
Ngoài ra, chúng ta có thể sử dụng pg_get_functiondef()
hàm để lấy định nghĩa. Hàm này thực sự cấu trúc lại lệnh tạo cho thủ tục được lưu trữ. Đây là bản tái tạo đã được dịch ngược, không phải văn bản gốc của lệnh. Điều này dẫn đến CREATE OR REPLACE PROCEDURE
tuyên bố cho thủ tục được lưu trữ.
Ví dụ:
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
pg_get_functiondef(p.oid) AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';
Lấy Dòng cụ thể tham chiếu đến bảng
Chúng tôi có thể sửa đổi truy vấn của mình để bao gồm số dòng tham chiếu đến bảng:
SELECT *
FROM (
SELECT
proname AS stored_procedure,
row_number() OVER (partition by proname) AS line_number,
textline
FROM (
SELECT
proname,
unnest(string_to_array(prosrc, chr(10))) AS textline
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public'
AND prosrc ILIKE '%artists%'
) lines
) x
WHERE textline ILIKE '%artists%';
Ví dụ này dựa trên câu trả lời Stack Overflow của Klin.