2013-02-22 92 views
2

我正在構建一個多租戶系統,其中許多客戶端數據將位於同一個數據庫中。如何確保所有Postgres查詢都有WHERE子句?

我對某些開發人員有些偏執,忘記將適當的「WHERE clientid =」放到每個查詢上。

有沒有辦法在數據庫級別確保每個查詢都有正確的WHERE =子句,從而確保不會執行任何查詢,而又不指定哪個客戶端查詢?

我想知道如果查詢重寫規則可以做到這一點,但它不知道他們是否可以這樣做。

感謝

+0

'select * from very_big_table WHERE 1 = 1;'voila!有你的where-clause ... – wildplasser 2013-02-23 13:03:57

回答

3

拒絕在桌子上t所有用戶的權限。然後給他們權限上的功能f返回表並接受參數CLIENT_ID:

create or replace function f(_client_id integer) 
returns setof t as 
$$ 
    select * 
    from t 
    where client_id = _client_id 
$$ language sql 
; 

select * from f(1); 
client_id | v 
-----------+--- 
     1 | 2 
+0

任何性能影響到這個解決方案? – 2013-02-23 03:57:32

1

另一種方法是創建一個VIEW爲:

SELECT * 
FROM t 
WHERE t.client_id = current_setting('session_vars.client_id'); 

,並在會話開始使用SET session_vars.client_id = 1234

拒絕對錶格進行訪問,只留下意見的許可。

您可能需要爲視圖(取決於您的PostgreSQL版本)創建UPDATE,DELETEINSERT的重寫規則。

因爲PostgreSQL會在執行前重寫查詢,所以性能損失很小(如果有的話)。