2

多くのクライアントデータが同じデータベースにあるマルチテナントシステムを構築しています。

私は、一部の開発者がすべてのクエリに適切な「WHEREclientid="」を付けるのを忘れていることを妄想しています。

データベースレベルで、すべてのクエリに正しい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 に答える