Postgres 9.x - 有没有办法避免将数据库连接信息硬编码到视图中?

时间:2012-05-15 17:09:20

标签: sql database postgresql postgresql-9.1

我经常手动将生产数据导入我的测试数据库,这样我就可以测试实际数据的新代码,以及测试升级方案或repro数据特定的错误。为此,我为测试数据库中的每个生产表设置了VIEW。这些视图看起来像这样:

CREATE VIEW ProdLink.Users AS
   select * from dblink(
      'hostaddr=123.123.123.123 dbname=ProductionDB user=ROUser password=secret',
      'select * from users') as t1(userid uuid, email varchar(50), alias varchar(50), fullname varchar(50), password varchar(100));

现在,在我的生产数据库中,我可以运行:

SELECT * FROM ProdLink.Users;

查看我的生产数据库中的所有用户。然后我可以做以下事情:

INSERT INTO Users SELECT * FROM ProdLink.Users L WHERE NOT EXISTS (select 1 from Users where Users.UserId = L.UserId);

允许我从测试中尚不存在的生产中吸引每个用户。

我对代理生产数据有大约30个这样的视图,但是我觉得必须在生产数据库连接信息中硬编码到每个视图中。

我的问题:有没有一种方法可以避免硬编码,或者至少在每个视图上复制此连接信息?我可以使用数据库级变量,环境变量或其他任何东西吗?

1 个答案:

答案 0 :(得分:1)

为避免重复,您可以将连接字符串存储在表中:

CREATE VIEW ProdLink.Users AS
    select * from dblink(
        (select conn_string from conn_string where conn = 'that_one'),
        'select * from users'
    ) as t1 (
        userid uuid, 
        email varchar(50), 
        alias varchar(50), 
        fullname varchar(50), 
        password varchar(100)
    );