Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在视图中动态选择架构名称_Sql_Postgresql - Fatal编程技术网

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;
调用like
dynamic\u view('a')
将返回来自
a.persons
的记录,
dynamic\u view('b')
将返回来自
b.persons
的记录

在这个示例中,我在这里创建了一个新的枚举类型,只允许输入
'a'
'b'
。这使得它不那么容易出错。但是,如果传递了无效值,当然也可以使用
varchar
和错误来执行此操作。您还可以使用动态SQL来允许使用传递任意架构名称。但是一定要检查输入是否正确。比如查找
pg_catalog.pg_namespace
,如果存在这样的模式

也许也有可能用函数代替函数