查找 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)。是否有任何查询可以找出列的位置。
如果您遵守命名约定以在整个架构中拥有唯一的列名称,则可以通过选择实现。
表:
select table_name
from information_schema.columns
where column_name = 'notes';
函数、程序:
select proname
from pg_proc
where prosrc like '%notes %';
浏览量和浏览量:
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_proc
的prosrc
属性中,但内容仅在运行时由语言处理程序解析,[=14]中没有存储依赖项=].
所以你能做的最好的事情就是
SELECT proname
FROM pg_proc
WHERE prosrc ILIKE '%val%';
但这可能会产生很多误报,您必须自己检查代码才能确定您的列是否被引用。
我们正在将 column(notes) 类型从 character(9) 更改为 varchar(50)。我们有数以千计的表、函数、过程和视图。我想确定所有位置,即使用此列的(表、函数、过程、索引、mview)。是否有任何查询可以找出列的位置。
如果您遵守命名约定以在整个架构中拥有唯一的列名称,则可以通过选择实现。
表:
select table_name from information_schema.columns where column_name = 'notes';
函数、程序:
select proname from pg_proc where prosrc like '%notes %';
浏览量和浏览量:
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_proc
的prosrc
属性中,但内容仅在运行时由语言处理程序解析,[=14]中没有存储依赖项=].
所以你能做的最好的事情就是
SELECT proname
FROM pg_proc
WHERE prosrc ILIKE '%val%';
但这可能会产生很多误报,您必须自己检查代码才能确定您的列是否被引用。