在下面提供的函数find_value_in_table()
中,我试图找到任何列的名称,这些列的记录中的列值与字符串“255.255.255.255”匹配。
简而言之,是这样的:
SELECT column_name
FROM dynamic_table
WHERE column_value = '255.255.255.255';
笔记:
- 表的名称作为参数传递给函数,因此“dynamic_table”
- 我正在尝试确定列的名称,而不是数据值。
这是第一步。稍后我还将参数化 column_value。我知道有一个表在"255.255.255.255"
某处存储该值,并且想通过查找存储该值的表和列名来证明该函数的功能。
这一切的目的是:我有大数据库,我是逆向工程。我知道它在某处包含应用程序的一些配置参数。在当前配置中,我知道其中一些参数的精确值(在应用程序配置 GUI 中可以看到:例如计算机名称、IP 地址)。我想浏览整个数据库以确定哪些表存储此配置信息。
我一直在构建find_value()
返回这些线索的函数。
如何才能做到这一点?
create or replace function find_all_columns(tablename in text)
return setof record as
$func$
declare r record;
begin
return select a.attname as "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
from
pg_catalog.pg_attribute a
where
a.attnum > 0
and not a.attisdropped
and a.attrelid = ( select c.oid from pg_catalog.pg_class c left join pg_catalog.pg_namespace n on n.oid = c.relnamespace where c.relname ~ '^(' || quote_ident(tablename) || ')$' and pg_catalog.pg_table_is_visible(c.oid);
end loop;
end;
$func$ language 'plpgsql';
create or replace function find_value_in_table(tablename text)
returns setof record as
$func$
declare r record;
return select
begin
for r in (select find_all_columns(tablename)) loop
return select * from tablename t where t... = "255.255.255.255" /* here column would be the value in the record: r.Column*/
end loop;
end;
$func$ language 'plpgsql';
create or replace function find_tables_name(_username text)
returns setof record as
$func$
declare
tbl text;
begin
for tbl in
select t.tablename from pg_tables t
where t.tableowner = _username and t.schemaname = 'public'
loop
return quote_ident(tbl);
end loop;
end;
$func$ language 'plpgsql';
create or replace function find_value(_username text, valuetofind text)
returns setof record as
$func$
declare r record;
begin
for r in (select find_tables_name(_username)) loop
return find_value_in_table( r.tablename );
end loop;
end;
$func$ language 'plpgsql';