在视图中动态选择模式名称

时间:2018-05-13 07:32:13

标签: sql postgresql

我有一个具有相同结构但位于不同模式的多个表的视图:

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;

我希望能够从函数或jwt属性(例如SCHMEA)动态获取current_setting('jwt.claims.schema')
有可能吗?

2 个答案:

答案 0 :(得分:0)

您应该set schemaset search_path toselect set_config更改其架构,但会保存视图定义,因此要动态运行它,您必须在每次运行时重新创建视图,这没有意义。

答案 1 :(得分:0)

您可以使用表函数。创建一个带参数的函数,并根据该参数查询a.personsb.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.personsdynamic_view('b')来自b.persons的记录。

在示例中,我在此处创建了一个新的枚举类型,仅允许'a''b'进行输入。这使得它不易出错。但是,如果传递的值无效,您当然也可以使用varcharRAISE错误执行此操作。您还可以使用动态SQL来允许使用RETURN QUERY EXECUTE传递任意模式名称。但是一定要检查输入是否合理。如果存在这样的模式,就像查找pg_catalog.pg_namespace

也许有可能使用rules代替函数来执行此操作。