Создание материализованного представления, которое наследует разрешения пользователя, выполняющего вызов представления - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать материализованное представление внутри функции, и представление должно иметь разрешение для пользователя, выполняющего вызов представления из моего приложения.Я знаю, что это можно сделать в функции, но есть ли способ сделать это в представлении при создании представления из моей функции?

Короче - я создаю представление в функции;Есть ли способ предоставить разрешения для представления в функции?

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;

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Изучив это, я подумал, что бывают случаи, когда вам также может понадобиться вызвать функцию, которая создает объекты в базе данных как пользователь, у которого нет прав на создание объектов.Таким образом, если вы хотите создать материализованное представление внутри функции, а пользователь, выполняющий вызов функции, имеет ограниченные разрешения, то вы можете различать, должна ли функция наследовать разрешения пользователя, создавшего функцию, или пользователя, создающеговызов функции.Это можно сделать следующим образом:

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;

Материализованное представление наследует разрешения пользователя, создавшего функцию.

0 голосов
/ 05 декабря 2018

Существует два способа:

  1. Явное выполнение оператора GRANT в функции сразу после создания материализованного представления:

    GRANT SELECT ON "schema".view_name_mv TO appuser;
    
  2. Используйте ALTER DEFAULT PRIVILEGES, чтобы любые будущие таблицы, представления и материализованные представления в этой схеме получали привилегии для пользователя:

    ALTER DEFAULT PRIVILEGES FOR ROLE creator IN SCHEMA "schema"
       GRANT SELECT ON TABLES TO appuser;
    

    Предполагается, что пользователь, создавший материализованное представление, равен creator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...