我在Postgresql中有一个存储过程,其中包含COMMIT语句,我希望用户仅访问该过程而没有授予他们选择,插入等的权利。在函数中,我将使用SECURITY DEFINER,但使用的是官方文档{{3 }}:
安全定义程序无法执行事务控制语句(例如,COMMIT和ROLLBACK,具体取决于语言)。
据我了解,这意味着我不能使用SECURITY DEFINER,而必须授予用户存储过程所需的任何权限,以允许用户执行存储过程,这完全违背了仅允许用户使用函数或过程的整个目的。
一个调用存储过程中带有COMMIT语句的存储过程如何不对过程中的所有语句进行单独授予?
答案 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
$$;