3

ビューを使用して、テーブル内の属性のサブセットへのアクセスを許可できることを知っています。しかし、どうすれば特定のタプルのみへのアクセスを許可できますか?登録済みの学生のテーブル、ユーザー名属性、およびdegree_statusなどの他のテーブルがある場合、ユーザーAがテーブルからユーザー名Aに対応するタプルのみを選択できるようにアクセスを許可するにはどうすればよいですか?私はデータベース試験を受けており、過去の論文をいくつか研究していて、この質問に出くわしましたが、答える方法がわからず、私の本「Dtabaseシステム:データベース設計への実用的なアプローチ」からそれを行う方法を見つけることができません。 、実装と管理 '

助けてくれてありがとう!

マット

4

4 に答える 4

3

あなたが得たと言う:

Table items (item_id, ...)
Table users (user_id, ...)
Table users_permissions( user_id, item_id, perm_type )

次のようなビューを作成できます。

SELECT i.*, p.perm_type 
FROM items JOIN users_permissions USING (item_id) 
WHERE user_id = get_current_user_id();

ユーザーはこのビューから選択できますが、権限を制限しているWHEREおよびJOINを削除することはできません。

get_current_user_id()関数が大きな問題になる可能性があります;)

于 2011-05-14T21:18:44.593 に答える
2

peufeuの答えに沿って、Postgresqlでは、現在のユーザー名は関数current_userを介して利用できます。だからビュー

CREATE VIEW available_bigtable AS
SELECT * FROM bigtable
WHERE username = current_user;

それはあなたが必要なことをするように見えます。ビューのすべてのユーザーに付与SELECTしますが、基になるの誰にも(管理者を除く)付与しませんbigtable

于 2011-05-14T21:58:49.940 に答える
1

Veilプロジェクトは、PostgreSQLの行レベルのアクセス制御のためのフレームワークを提供します。

于 2011-05-14T23:08:25.017 に答える
0

ユーザーIDを取得し、アクセスできる行のサブセットを返す関数を作成するのはどうですか?

CREATE FUNCTION user_items(integer) RETURNS SETOF items AS $$
    SELECT * FROM items WHERE user_id = $1
$$ LANGUAGE SQL;

SELECT * FROM user_items(55); # 55 being the user id

編集もっと考えてみると、user_id条件は他の「ユーザーランド」条件の前にデータセット全体に適用されるため、これはパフォーマンスにかなりの打撃を与える可能性があります。

たとえば、SELECT * FROM user_items(55) WHERE id=45最初にユーザーアイテムのテーブル全体をフィルタリングし、そのサブセットでIDを検索するだけです。

ビューを使用すると、クエリプランナーは条件を評価するための最適な順序を決定できます(ユーザーIDではなくIDを最初にフィルター処理する可能性があります)。私が提案したような関数を使用する場合、postgresはそれを行うことができません。

于 2012-11-25T12:24:16.470 に答える