Sql 在视图中动态选择架构名称
我有一个视图,用于具有相同结构但模式不同的多个表:Sql 在视图中动态选择架构名称,sql,postgresql,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\u设置('jwt.claims.
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\u设置('jwt.claims.schema')
)
可以这样做吗?您应该
设置架构
或将搜索路径设置为
或选择设置配置
来更改架构,但视图定义已保存,因此要动态运行它,您必须在每次运行时重新创建视图,这是没有意义的。您可以使用表函数来实现这一点。创建一个函数,该函数接受一个参数,并根据该参数查询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;
调用likedynamic\u view('a')
将返回来自a.persons
的记录,dynamic\u view('b')
将返回来自b.persons
的记录
在这个示例中,我在这里创建了一个新的枚举类型,只允许输入'a'
或'b'
。这使得它不那么容易出错。但是,如果传递了无效值,当然也可以使用varchar
和错误来执行此操作。您还可以使用动态SQL来允许使用传递任意架构名称。但是一定要检查输入是否正确。比如查找pg_catalog.pg_namespace
,如果存在这样的模式
也许也有可能用函数代替函数