我正在構建一個多租戶系統,其中許多客戶端數據將位於同一個數據庫中。如何確保所有Postgres查詢都有WHERE子句?
我對某些開發人員有些偏執,忘記將適當的「WHERE clientid =」放到每個查詢上。
有沒有辦法在數據庫級別確保每個查詢都有正確的WHERE =子句,從而確保不會執行任何查詢,而又不指定哪個客戶端查詢?
我想知道如果查詢重寫規則可以做到這一點,但它不知道他們是否可以這樣做。
感謝
我正在構建一個多租戶系統,其中許多客戶端數據將位於同一個數據庫中。如何確保所有Postgres查詢都有WHERE子句?
我對某些開發人員有些偏執,忘記將適當的「WHERE clientid =」放到每個查詢上。
有沒有辦法在數據庫級別確保每個查詢都有正確的WHERE =子句,從而確保不會執行任何查詢,而又不指定哪個客戶端查詢?
我想知道如果查詢重寫規則可以做到這一點,但它不知道他們是否可以這樣做。
感謝
拒絕在桌子上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
任何性能影響到這個解決方案? – 2013-02-23 03:57:32
另一種方法是創建一個VIEW
爲:
SELECT *
FROM t
WHERE t.client_id = current_setting('session_vars.client_id');
,並在會話開始使用SET session_vars.client_id = 1234
。
拒絕對錶格進行訪問,只留下意見的許可。
您可能需要爲視圖(取決於您的PostgreSQL版本)創建UPDATE
,DELETE
,INSERT
的重寫規則。
因爲PostgreSQL會在執行前重寫查詢,所以性能損失很小(如果有的話)。
'select * from very_big_table WHERE 1 = 1;'voila!有你的where-clause ... – wildplasser 2013-02-23 13:03:57