如何在不授予其他权限的情况下允许用户在Postgresql中调用存储过程?

时间:2019-05-16 12:13:54

标签: postgresql stored-procedures transactions

我在Postgresql中有一个存储过程,其中包含COMMIT语句,我希望用户仅访问该过程而没有授予他们选择,插入等的权利。在函数中,我将使用SECURITY DEFINER,但使用的是官方文档{{3 }}:

  

安全定义程序无法执行事务控制语句(例如,COMMIT和ROLLBACK,具体取决于语言)。

据我了解,这意味着我不能使用SECURITY DEFINER,而必须授予用户存储过程所需的任何权限,以允许用户执行存储过程,这完全违背了仅允许用户使用函数或过程的整个目的。

一个调用存储过程中带有COMMIT语句的存储过程如何不对过程中的所有语句进行单独授予?

2 个答案:

答案 0 :(得分:0)

您可以授予特定过程特权,以便用户只能对该过程具有事务控制特权。

GRANT ALL ON PROCEDURE <procedure_name> TO <role>;

答案 1 :(得分:0)

对此限制有一种解决方法。

安全定义程序无法执行事务控制 语句(例如,COMMIT和ROLLBACK,具体取决于 语言)。

可以从存储过程中使用SECURITY DEFINER调用(SELECT或PERFORM)函数。当然,用户必须在过程和功能上都具有GRANT EXECUTE。

CREATE OR REPLACE PROCEDURE procedure_test()
    LANGUAGE plpgsql
AS $$
begin

    PERFORM function_test();
    COMMIT;
    PERFORM function_test();

end
$$;

CREATE OR REPLACE FUNCTION function_test(
) RETURNS void
    LANGUAGE plpgsql SECURITY DEFINER
AS $$
begin

    -- some code

end
$$;