我使用的是postgresql 8.4,当视图使用任何数据库函数时,对另一个用户访问的数据库中的视图授予select权限有点问题。
作为新用户,当我尝试运行时,例如选择*from users_pwd;其中users_pwd定义为:

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

并获得:
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,我不想这样做。
如果一个视图不使用任何函数,而只是其他表,而新用户没有显式访问它的功能,那么这个视图工作得非常好。

最佳答案

您可以使用可以从表用户中选择的所有者创建函数。这样的函数应该用SECURITY DEFINER子句创建,所以它将以所有者的权限执行。
您可以在此处找到更多信息:http://www.postgresql.org/docs/9.0/interactive/sql-createfunction.html
您还可以授予函数的执行权限。参见文档中的GRANT

10-06 05:01