Изучив это, я подумал, что бывают случаи, когда вам также может понадобиться вызвать функцию, которая создает объекты в базе данных как пользователь, у которого нет прав на создание объектов.Таким образом, если вы хотите создать материализованное представление внутри функции, а пользователь, выполняющий вызов функции, имеет ограниченные разрешения, то вы можете различать, должна ли функция наследовать разрешения пользователя, создавшего функцию, или пользователя, создающеговызов функции.Это можно сделать следующим образом:
Security Invoker: указывает, что функция должна выполняться с привилегиями пользователя, который ее вызывает.Это значение по умолчанию.
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;
Материализованное представление наследует разрешения пользователя, выполняющего вызов.
Определитель безопасности: ОПРЕДЕЛИТЕЛЬ БЕЗОПАСНОСТИуказывает, что функция должна выполняться с привилегиями пользователя, который ее создал.
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;
Материализованное представление наследует разрешения пользователя, создавшего функцию.