2

我正在构建一个多租户系统,其中许多客户数据将位于同一个数据库中。

我对某些开发人员忘记在每个查询中添加适当的“WHERE clientid =”感到偏执。

有没有办法在数据库级别确保每个查询都有正确的 WHERE = 子句,从而确保在不指定查询是针对哪个客户端的情况下不会执行任何查询?

我想知道查询重写规则是否可以做到这一点,但我不清楚他们是否可以这样做。

谢谢

4

2 回答 2

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
于 2013-02-23T00:04:00.643 回答
1

另一种方法是创建一个VIEWfor:

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

SET session_vars.client_id = 1234在会话开始时使用。

拒绝访问表,只保留视图许可。

您可能需要为视图创建重写规则UPDATE, DELETE, INSERT(这取决于您的 PostgreSQL 版本)。

性能损失会很小(如果有的话),因为 PostgreSQL 会在执行前重写查询。

于 2013-02-23T10:32:34.603 回答