我正在使用 postgresql 8.4,当 View 使用任何数据库函数时,从不同用户拥有的数据库中授予 View 的选择权限时遇到了一些问题。
作为新用户,当我尝试运行时,例如 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
让用户查询 View 的唯一方法是显式授予对表用户的选择权限,但我不想这样做。
如果 View 不使用任何函数,而只是新用户没有显式访问权限的其他表,则它工作得很好。
最佳答案
您可以创建具有所有者的函数,所有者可以从表用户中进行选择。这样的函数应该使用 SECURITY DEFINER 子句创建,因此它将以所有者权限执行。
您可以在这里找到更多信息:http://www.postgresql.org/docs/9.0/interactive/sql-createfunction.html
您还可以授予函数的 EXECUTE 权限。请参阅GRANT在文档中。
关于function - 授予使用函数的 View 的选择权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559846/