postgresql 使用current_settings中的值建立postgres_fdw连接

wz1wpwve  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(361)

我正在尝试设置一个PostgreSQL外部数据 Package 器,并从current_settings访问凭据,这样它们就不会在我的源代码中硬编码。
下面是我的代码:

  1. CREATE EXTENSION postgres_fdw;
  2. CREATE SERVER remote_server
  3. FOREIGN DATA WRAPPER postgres_fdw
  4. OPTIONS (
  5. host current_setting('db.REMOTE_DB_HOST'),
  6. port current_setting('db.REMOTE_DB_PORT'),
  7. dbname current_setting('db.REMOTE_DB_NAME')
  8. );

手之前,我已把国书中的话设定为这样:

  1. SET db.REMOTE_DB_HOST='localhost';
  2. SET db.REMOTE_DB_PORT='5432';
  3. SET db.REMOTE_DB_NAME='remotedb';

现在,我可以毫无问题地得到这些值:

  1. SELECT current_setting('db.REMOTE_DB_HOST') AS host, current_setting('db.REMOTE_DB_PORT') AS port, current_setting('db.REMOTE_DB_NAME') AS dbname;

产生预期的

  1. host | port | dbname
  2. -----------+------+----------
  3. localhost | 5432 | remotedb

但是,当我尝试建立remote_server连接时,我得到了以下错误,没有任何其他详细信息:

  1. ERROR: syntax error at or near "current_setting"
  2. LINE 4: host current_setting('db.REMOTE_DB_HOST'),
am46iovg

am46iovg1#

DDL命令不允许插入。您无法在CREATE SERVER命令内执行命令,只能传递常值常数。请连接命令字串并执行。
可以在DO命令中将动态SQL与EXECUTE一起使用:

  1. CREATE EXTENSION postgres_fdw; -- this works as is
  2. DO -- dynamic SQL with EXECUTE
  3. $$
  4. BEGIN
  5. EXECUTE format('CREATE SERVER remote_server
  6. FOREIGN DATA WRAPPER postgres_fdw
  7. OPTIONS (host %L, port %L, dbname %L)'
  8. , current_setting('db.REMOTE_DB_HOST')
  9. , current_setting('db.REMOTE_DB_PORT')
  10. , current_setting('db.REMOTE_DB_NAME')
  11. );
  12. END
  13. $$;

相关:

  • 如何在创建检查约束时替换变量?
展开查看全部

相关问题