2017-04-25 77 views
0

我有一個使用postgresql模式進行多租戶用途的數據庫。它在名爲customerspublic模式中有一個表,其中idtenant列。 tenant的值是一個字符串,並且有一個相應的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。

所以,如果我有一個customer_id 1,我怎麼能select * from first.users在一個單一的查詢。

我猜這可能必須是用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

你不能用單個查詢來做到這一點。

您必須使用一個查詢來選擇模式名稱,然後構造第二個查詢並運行該查詢。

當然,您可以定義一個PL/pgSQL函數來爲您執行這兩個操作,並使用EXECUTE執行動態查詢。