我有一个具有相同结构但位于不同模式的多个表的视图:
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')
。
有可能吗?
答案 0 :(得分:0)
您应该set schema
或set search_path to
或select set_config
更改其架构,但会保存视图定义,因此要动态运行它,您必须在每次运行时重新创建视图,这没有意义。
答案 1 :(得分:0)
您可以使用表函数。创建一个带参数的函数,并根据该参数查询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代替函数来执行此操作。