2011-07-02 3 views
2

私はpostgresql 8.4を使用していますが、ビューがデータベース機能のいずれかを使用しているときに別のユーザーが使用しているデータベースからのビューに対する選択権限を与えています。機能を使用するビューで選択を許可する

新しいユーザーとして、実行しようとすると、たとえばselect * from users_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 

ビューがにあるユーザーのクエリを持っているための唯一の方法

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

としてget_pwd:users_pwdは次のように定義されて私がしたくないテーブルユーザーに明示的にselectを与えます。

ビューで関数を使用するのではなく、新しいユーザーが明示的にアクセスできない他のテーブルだけであれば、完全に正常に動作します。

答えて

4

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

詳しい情報あなたはここで見つけることができます:http://www.postgresql.org/docs/9.0/interactive/sql-createfunction.html

はまた、機能上のEXECUTE権限を付与することができます。ドキュメントのGRANTを参照してください。

関連する問題