我正在使用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
让用户查询视图的唯一方法是在表用户上明确授予select,我不想这样做。
如果一个视图不使用任何函数,而只是新用户没有明确访问权限的其他表,那么就可以正常工作。
答案 0 :(得分:4)
您可以创建具有所有者的功能,该所有者可以从表用户中进行选择。应该使用SECURITY DEFINER子句创建这样的函数,因此它将以所有者权限执行。
您可以在此处找到更多信息:http://www.postgresql.org/docs/9.0/interactive/sql-createfunction.html
您还可以对功能授予GRANT EXECUTE权限。请参阅文档中的GRANT。