PostgreSQL限制用户只能使用函数和过程

gab6jxml  于 2023-05-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(158)

我是新的一般数据库,我需要一些帮助与用户权限。我用C#创建了一个桌面应用程序,它使用npgsql连接到我的PostgreSQL数据库。对数据库的每个命令都是一个函数或过程。我想在我的C#代码中为数据库创建一个用户,该用户只有权执行那些特定的函数和过程,仅此而已。
我使用以下代码创建用户:

create user userdb with password 'blabla';
GRANT CONNECT ON DATABASE test TO userdb;
REVOKE ALL PRIVILEGES ON DATABASE test FROM userdb;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM userdb;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM userdb;

然后,我对每个过程和函数执行以下操作:

GRANT EXECUTE ON FUNCTION LoadEmails() TO userdb;

当我运行任何过程或函数时,我得到一个错误42501:拒绝表电子邮件的权限。
LoadEmails()的示例代码:

CREATE OR REPLACE FUNCTION LoadEmails()
RETURNS setof text AS $$
BEGIN
  RETURN QUERY SELECT email FROM emails;
END
$$ LANGUAGE plpgsql;

任何帮助将不胜感激。先谢谢你了。

gwbalxhn

gwbalxhn1#

默认情况下,函数以调用函数的用户的权限运行。指定SECURITY DEFINER以允许函数使用拥有该函数的用户的权限。

CREATE OR REPLACE FUNCTION LoadEmails()
RETURNS setof text
SECURITY DEFINER
AS $$
BEGIN
  RETURN QUERY SELECT email FROM emails;
END
$$ LANGUAGE plpgsql;
92dk7w1h

92dk7w1h2#

错误是因为访问数据库的用户没有权限在“email”表上执行。函数本身需要额外的权限来执行查询。
您需要做的是向用户授予权限。这可以如下进行:

GRANT SELECT ON TABLE myTable TO myUser;

有关存储过程,请参阅here

相关问题