postgres选择所有模式

时间:2014-05-20 14:13:11

标签: postgresql

假设我有3个架构:foo,bar,baz。所以我能做到:

select * from foo.table, bar.table, baz.table;

如果我不想指定模式名称,并且我想在所有模式中选择或者某些用户拥有所有模式,该怎么办?

1 个答案:

答案 0 :(得分:3)

如果您的表名称不同(大多数情况下应该是规则),请设置search path

select * from foo.table1, bar.table2, baz.table3;

set search_path = foo, bar, baz;
select * from table1, table2, table3;

重要提示:使用显式连接而不是在from子句中列出表。

select * 
    from table1
    join table2 on ...
    join table3 on ...

如果在多个模式中具有相同名称的表,则可以在函数中引用它们。您需要系统目录中的信息:

  • pg_class - 包含有关数据库中所有表(和其他关系)的信息的目录,
  • pg_namespace - 包含有关数据库中所有模式的信息的目录。

此查询列出数据库中 given_table_name 的所有表:

select 
    n.nspname, c.relname
from 
    pg_class c
join 
    pg_namespace n on n.oid = c.relnamespace
where 
    c.relkind = 'r' 
    and c.relname = 'given_table_name';

以下功能:

  • 在pg_class,
  • 中查找具有给定名称的所有表
  • 查找pg_namespace以查找上面找到的表的模式名称,
  • 为给定名称添加模式名称作为前缀的所有表执行函数。

假设您之前已定义了函数 do_something_with_this_table(tablename regclass)

create function do_something_with_all_these_tables(tablename text)
returns void language plpgsql 
as $$
declare
    schemaname text;
begin
    for schemaname in
        select n.nspname
        from pg_class c
        join pg_namespace n on n.oid = c.relnamespace
        where c.relkind = 'r' and c.relname = tablename
    loop
        execute format(
            'select do_something_with_this_table(''%s.%s'')',
            schemaname, tablename);
    end loop;
end $$;

select do_something_with_all_these_tables('given_table_name');

了解更多:

相关问题