2017-04-25 4 views
0

マルチテナントの目的でpostgresqlスキーマを使用するデータベースがあります。これは、というというスキーマ内のテーブルと、idtenantの列を持っています。テナントの値は文字列であり、対応するpostgresqlスキーマがテーブルにあります。Postgresクエリの列の値をスキーマのプレフィックスに変換します。

それは次のようになります。

# 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与えられ、スキーマ内のテーブルから値を取得するために、単一のクエリを作ることができるかと思いまして。

したがって、1のcustomer_idがある場合、どのようにしてselect * from first.usersを1つのクエリで使用できますか。

これはpgpsqlで書かれた関数でなければならないかもしれないと思いますが、私はそれに多くの経験はありません。次のようなもの:

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

+0

リレーションの間にFKがありますか?.. –

+0

FK ........いいえ – brad

答えて

0
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; 
0

これは単一のクエリでは実行できません。

スキーマ名を選択する1つのクエリを使用し、次に2番目のクエリを作成して実行する必要があります。

もちろん、あなたに代わってEXECUTEで動的クエリを実行するPL/pgSQL関数を定義できます。

関連する問題