Динамический выбор имени схемы в представлении - PullRequest
0 голосов
/ 13 мая 2018

У меня есть представление для нескольких таблиц с одинаковой структурой, но в разных схемах:

create table a.persons (
    name text primary key
);
create table b.persons (
    name text primary key
);
create view dynamic_persons as select * from SCHEMA.persons;

Я хочу иметь возможность динамически получать SCHMEA из функции или атрибута jwt (current_setting('jwt.claims.schema')например).
Можно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Для этого вы можете использовать табличную функцию.Создайте функцию, которая принимает аргумент и в зависимости от этого аргумента запрашивает a.persons или b.persons.

Пример:

CREATE TYPE schema_switch AS ENUM ('a', 'b');

CREATE OR REPLACE FUNCTION dynamic_view (_schema schema_switch)
RETURNS TABLE (name text)
AS
$$
DECLARE
  x INT;
BEGIN
  CASE 
    WHEN _schema ='a'
      THEN RETURN QUERY SELECT persons.name
                               FROM a.persons;
    WHEN _schema ='b'
      THEN RETURN QUERY SELECT persons.name
                               FROM b.persons;
  END CASE;
END;
$$
LANGUAGE plpgsql;

Вызванный как dynamic_view('a') вернет записи изa.persons, dynamic_view('b') те из b.persons.

В этом примере я создал новый тип перечисления, который позволяет только 'a' или 'b' для ввода.Это делает его менее подверженным ошибкам.Но вы, конечно, могли бы также сделать это с varchar и RAISE ошибкой, если было передано недопустимое значение.Вы также можете использовать динамический SQL, чтобы разрешить передачу произвольного имени схемы, используя RETURN QUERY EXECUTE.Но не забудьте проверить правильность ввода. Затем посмотрите pg_catalog.pg_namespace, если такая схема существует.

Возможно, есть также возможность сделать это с rules вместо функции.

0 голосов
/ 13 мая 2018

вы должны set schema или set search_path to или select set_config, чтобы изменить схему, но определение представления сохранено, поэтому для его динамического запуска вам придется заново создавать представление при каждом запуске, что не имеет смысла .

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