【问题标题】:Postgres Translate column value into schema prefix in a queryPostgres 将列值转换为查询中的模式前缀
【发布时间】:2017-04-25 22:26:19
【问题描述】:

我有一个将 postgresql 模式用于多租户目的的数据库。它在public 模式中有一个名为customers 的表,其中包含idtenant 列。租户的值是一个字符串,并且有一个相应的 postgresql 模式,其中包含匹配的表。

看起来像这样:

# public.customers  # first.users    # second.users
| id | tenant |     | id | name   |  | id | name   |
|----|--------|     |----|--------|  |----|--------|
| 1  | first  |     | 1  | bob    |  | 1  | jen    |
| 2  | second |     | 2  | jess   |  | 2  | mike   |

我想知道如何通过一个查询来从架构中的表中获取值,只要给定一个客户 ID。

因此,如果我的 customer_id 为 1,我如何在单个查询中 select * from first.users

我猜这可能是一个用 pgpsql 编写的函数,但我对此没有太多经验。比如:

select * from tenant_table(1, 'users');

?

【问题讨论】:

  • 关系之间有FK吗?..
  • 没有 FK........ 没有

标签: postgresql


【解决方案1】:
create or replace function f(_id int)
returns table (id int, name text) as $f$
declare _tenant text;
begin;

    select tenant into _tenant
    from public.customers
    where id = _id;

    return query execute format($e$
        select *
        from %I.users
    $e$, _tenant);
end;

$f$ language plpgsql;

【讨论】:

    【解决方案2】:

    你不能用一个查询来做到这一点。

    您必须使用一个查询来选择架构名称,然后构造第二个查询并运行它。

    当然,您可以定义一个 PL/pgSQL 函数,该函数既可以为您工作,又可以使用 EXECUTE 执行动态查询。

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2015-06-27
      相关资源
      最近更新 更多