PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

3 cách liệt kê tất cả các thủ tục được lưu trữ tham chiếu đến một bảng trong PostgreSQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn ĐẶT HÀNG THEO số hàng được trả về từ một LỰA CHỌN khác

  2. Tạo chuỗi ngày - sử dụng loại ngày làm đầu vào

  3. Vị trí cột id trong Postgresql có quan trọng không?

  4. Xu hướng PostgreSQL mới nhất:Các công việc tiêu tốn nhiều thời gian nhất &các chỉ số quan trọng cần theo dõi

  5. Spark Dataframes UPSERT to Postgres Table