2

我正在使用 postgresql 8.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

让用户查询视图的唯一方法是显式授予对我不想执行的表users的选择。

如果一个视图不使用任何函数,而只是新用户没有显式访问它的其他表,那么它工作得很好。

4

1 回答 1

4

您可以使用可以从表用户中选择的所有者创建函数。这样的函数应该使用 SECURITY DEFINER 子句创建,因此它将以所有者权限执行。

您可以在这里找到更多信息:http ://www.postgresql.org/docs/9.0/interactive/sql-createfunction.html

您还可以 GRANT EXECUTE 对函数的权限。请参阅文档中的GRANT

于 2011-07-02T22:24:51.863 回答