function - 授予使用函数的 View 的选择权

标签 function postgresql select view sql-grant

我正在使用 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/

相关文章:

Azure Function TimeTrigger 一遍又一遍地运行

sql - 如何迭代具有已知起始位置和混合列顺序的行,就像遍历相应的索引一样?

mysql - 使用 GROUP BY 获取单个值 - MySQL

r - 如何使循环函数将其结果输出为R中的数据帧

java - 在java中生成函数值

java - Hibernate序列生成器始终为0

sql - 将 get_absolute_url 组合成 django 中的原始 SQL 语句

java - 为什么 TOAD 比我的 java 代码更快?

mysql - 在别名连接字段中使用 WHERE 会出现 'unknown column' 错误

c++ - 从数组输出的数字与使用递归函数输入的数字不同?