查找 PostgreSQL 数据库中表、过程、函数使用的特定列的所有出现

Finding all the occurrence of the specific column used by the tables, procedures, functions in the PostgreSQL database

我们正在将 column(notes) 类型从 character(9) 更改为 varchar(50)。我们有数以千计的表、函数、过程和视图。我想确定所有位置,即使用此列的(表、函数、过程、索引、mview)。是否有任何查询可以找出列的位置。

如果您遵守命名约定以在整个架构中拥有唯一的列名称,则可以通过选择实现。

  1. 表:

    select table_name 
    from information_schema.columns 
    where column_name = 'notes';
    
  2. 函数、程序:

    select proname 
    from pg_proc 
    where prosrc like '%notes %';
    
  3. 浏览量和浏览量:

    select * from pg_matviews where definition like '%notes%';
    select * from pg_views where definition like '%notes%';
    

当然,这种方法的效率完全取决于您如何称呼您的专栏。而且从你提供的名字notes来看,我认为它会很低。

这个问题不好解决

对于查看规则,您可以通过查询 pg_depend 系统目录来获取信息。

以下是视图和物化视图的工作原理:

CREATE TABLE mytable (id integer PRIMARY KEY, val text NOT NULL);

CREATE VIEW myview AS
   SELECT count(id) AS c, val FROM mytable GROUP BY val;

现在我们找出val列的属性编号:

SELECT attnum
FROM pg_attribute
WHERE attrelid = 'mytable'::regclass
  AND attname = 'val';

┌────────┐
│ attnum │
├────────┤
│      2 │
└────────┘
(1 row)

现在我们可以找出哪些视图依赖于列:

SELECT ev_class::regclass
FROM pg_depend d
   JOIN pg_rewrite r
      ON d.objid = r.oid
WHERE d.refclassid = 'pg_class'::regclass
  AND d.refobjid = 'mytable'::regclass
  AND d.refobjsubid = 2
  AND r.rulename = '_RETURN';

┌──────────┐
│ ev_class │
├──────────┤
│ myview   │
└──────────┘
(1 row)

真正的问题出现在函数上。

函数体以字符串形式存储在pg_procprosrc属性中,但内容仅在运行时由语言处理程序解析,[=14]中没有存储依赖项=].

所以你能做的最好的事情就是

SELECT proname
FROM pg_proc
WHERE prosrc ILIKE '%val%';

但这可能会产生很多误报,您必须自己检查代码才能确定您的列是否被引用。