我想通过从 current_database() 获取数据库名称并将其传递到视图中,例如
create view viewname as select * from db.schema.tablename
.
以便它可以跨不同数据库运行(架构和表名在不同环境下保持不变)
设置会话变量没有帮助,因为对于不同的用户,它会抛出错误,指出找不到该变量。有没有其他方法可以做到?
还有一种不使用会话变量的替代方法,即创建一个使用 current_database() 函数动态生成视图定义的函数。
CREATE OR REPLACE FUNCTION generate_view_definition()
RETURNS TEXT AS $$
BEGIN
RETURN 'CREATE OR REPLACE VIEW viewname AS SELECT * FROM ' || current_database() || '.schema.tablename;';
END;
$$ LANGUAGE plpgsql;
使用以下命令执行函数以获取视图的动态SQL
SELECT generate_view_definition();
& 使用动态 SQL 创建视图
DO $$
BEGIN
EXECUTE generate_view_definition();
END;
$$;
这将执行动态 SQL 以使用从 current_database() 获取的数据库名称创建视图。
注: 请记住,在视图中使用动态 SQL 可能会对安全性和性能产生影响,因此请确保在生产环境中实现之前进行彻底的验证和测试。