2

私はpostgresql8.4を使用していますが、ビューがデータベース機能のいずれかを使用している場合に、別のユーザーがデータベースからのビューに選択権限を付与する際に少し問題があります。

新しいユーザーとして、実行しようとすると、たとえばselect * from users_pwd; ここで、users_pwdは次のように定義されます。

create view users_pwd as
select *, get_pwd(id)
from users;

およびget_pwdは次のようになります。

CREATE OR REPLACE FUNCTION get_pwd(p_id integer)
RETURNS text AS
$BODY$
declare u record;
BEGIN
select into u * from users where id = p_id;
return u.password;
END;
$BODY$
LANGUAGE plpgsql;

次のエラーが発生します。

ERROR:  permission denied for relation users
CONTEXT:  SQL statement "select * from users where id =  $1 "
PL/pgSQL function "get_pwd" line 3 at SQL statement

ユーザーにビューをクエリさせる唯一の方法は、私がしたくないテーブルユーザーにselectを明示的に許可することです。

ビューが関数を使用せず、新しいユーザーが明示的にアクセスできない他のテーブルだけを使用する場合は、完全に正常に機能します。

4

1 に答える 1

4

テーブルusersから選択できるownerで関数を作成できます。このような関数は、SECURITY DEFINER句を使用して作成する必要があるため、所有者権限で実行されます。

詳細については、http ://www.postgresql.org/docs/9.0/interactive/sql-createfunction.htmlを参照してください。

関数に対するGRANTEXECUTE特権を付与することもできます。ドキュメントのGRANTを参照してください。

于 2011-07-02T22:24:51.863 に答える