我正在尝试在函数中创建实例化视图,并且该视图需要获得用户从我的应用程序内进行视图调用的许可。我知道可以在函数中完成此操作,但是从我的函数中创建视图时,是否可以在视图上执行此操作?
简而言之—我正在函数中创建视图;有没有一种方法可以向该功能内的视图授予权限?
CREATE OR REPLACE FUNCTION schema.my_function()
RETURNS void AS $body$
DECLARE
view_name TEXT := '';
BEGIN
view_name := $vn$
CREATE MATERIALIZED VIEW schema.view_name_mv
(
"column1",
"column2",
"column3"
)
as
select
column1,
column2,
column3
from schema.table_name;
$vn$;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;
答案 0 :(得分:2)
有两种方法:
在创建实例化视图之后,立即在函数中明确发出GRANT
语句:
GRANT SELECT ON "schema".view_name_mv TO appuser;
使用ALTER DEFAULT PRIVILEGES
,以便该架构中的任何将来的表,视图和实例化视图都获得用户的特权:
ALTER DEFAULT PRIVILEGES FOR ROLE creator IN SCHEMA "schema"
GRANT SELECT ON TABLES TO appuser;
这假定创建实例化视图的用户为creator
。
答案 1 :(得分:0)
在对此进行回顾之后,我认为在某些情况下,您可能还需要进行一个函数调用,该调用正在以没有权限创建对象的用户身份在数据库内创建对象。因此,如果要在函数内创建实例化视图,并且进行函数调用的用户具有有限的权限,则可能需要区分函数是否应继承创建函数的用户或进行该操作的用户的权限。该函数的调用。可以按照以下步骤进行操作:
安全调用程序: 表示该功能将以调用该功能的用户的特权来执行。这是默认设置。
CREATE OR REPLACE FUNCTION schema.my_function_si()
RETURNS void AS $body$
DECLARE
view_name TEXT := '';
BEGIN
view_name := $vn$
CREATE MATERIALIZED VIEW schema.view_name_mv
(
"column1",
"column2",
"column3"
)
as
select
column1,
column2,
column3
from schema.table_name;
$vn$;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE SECURITY INVOKER;
物化视图将继承进行呼叫的用户的权限。
安全定义器: SECURITY DEFINER指定要使用创建该函数的用户的特权来执行该函数。
CREATE OR REPLACE FUNCTION schema.my_function_sd()
RETURNS void AS $body$
DECLARE
view_name TEXT := '';
BEGIN
view_name := $vn$
CREATE MATERIALIZED VIEW schema.view_name_mv
(
"column1",
"column2",
"column3"
)
as
select
column1,
column2,
column3
from schema.table_name;
$vn$;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;
材料化视图将继承创建该功能的用户的权限。