Postgres JDBC连接作为应用程序用户而不是系统用户

Posted

技术标签:

【中文标题】Postgres JDBC连接作为应用程序用户而不是系统用户【英文标题】:Postgres JDBC connection as app user instead of system user 【发布时间】:2019-01-31 07:24:48 【问题描述】:

我正在使用 flyway 将我的集成测试数据库作为我的 maven 构建的一部分进行迁移。

我已将 flyway 配置为在 pre-integration-test 阶段运行。它每次都会清理然后重建数据库。

<build>
  <plugins>

    <!-- Flyway -->
    <plugin>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-maven-plugin</artifactId>
      <version>5.1.4</version>

      <configuration>
        <url>$jdbc.url</url>
        <schemas>
          <schema>public</schema>
        </schemas>
      </configuration>
      <executions>
        <execution>
          <id>migrate-database</id>
          <phase>pre-integration-test</phase>
          <goals>
            <goal>clean</goal>
            <goal>migrate</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

  </plugins>
</build>

我使用mvn clean install 运行构建,将测试数据库的 JDBC url 传递给它。如您所见,它以 postgres 用户 racer 的身份连接到 racer_test

mvn -Djdbc.url=jdbc:postgresql://localhost:5432/racer_test?user%3Dracer%26password%3Dfoo clean install

在构建过程中一切正常

[INFO] --- flyway-maven-plugin:5.1.4:clean (migrate-database) @ racer-api ---
[INFO] Flyway Community Edition 5.1.4 by Boxfuse
[INFO] Database: jdbc:postgresql://localhost:5432/racer_test (PostgreSQL 9.6)
[INFO] Successfully cleaned schema "public" (execution time 00:00.026s)
[INFO]
[INFO] --- flyway-maven-plugin:5.1.4:migrate (migrate-database) @ racer-api ---
[INFO] Database: jdbc:postgresql://localhost:5432/racer_test (PostgreSQL 9.6)
[INFO] Successfully validated 1 migration (execution time 00:00.005s)
[INFO] Creating Schema History table: "public"."flyway_schema_history"
[INFO] Current version of schema "public": << Empty Schema >>
[INFO] Migrating schema "public" to version 1 - create users
[INFO] Successfully applied 1 migration to schema "public" (execution time 00:00.040s)

但是,当我在 postgres 中查看数据库时,它以我登录的系统用户 (jeeves) 而不是我指定的用户 (racer) 的身份创建了表和其他对象

racer_test=> \d
                  List of relations
 Schema |         Name          |   Type   | Owner
--------+-----------------------+----------+--------
 public | flyway_schema_history | table    | jeeves
 public | users                 | table    | jeeves
 public | users_id_seq          | sequence | jeeves
(3 rows)

我以某种方式指定用户是否不正确?它不应该是 JDBC url 的一部分吗?

谢谢!

【问题讨论】:

【参考方案1】:

您应该使用 flyway 用户参数来执行此操作:只需将 -Dflyway.user=racer 添加到您的 maven 命令中,这应该可以正常工作!如果您使用的是flyway.properties 文件,只需将flyway.user=racer 附加到它。

另外,如果使用 url,使用 postgres 的用户应该设置如下:

jdbc:postgresql://$user:$optional_password@$host:$port/$db_name$GET_parameters

【讨论】:

感谢您的意见。我感到困惑的一个原因是因为 Postgres 9.4 的官方文档显示用户将被指定为查询参数。他们给出的例子是"jdbc:postgresql://localhost/test?user=fred&amp;password=secret&amp;ssl=true",取自这里:jdbc.postgresql.org/documentation/94/connect.html。因此,如果这是官方支持的 JDBC URL 格式,理论上我不应该单独指定用户,对吧?除非它是不尊重这一点的飞行路线。 @user2490003 好吧,我不是 100% 确定,但我认为 flyway 可能会根据您提供的其他参数覆盖此参数。我建议使用第一个或第二个选项,因为我知道(同时使用它们)它们有效。明确地说,我在部署构建中使用-Dflyway.*** 并指定连接所需的所有参数,而不仅仅是url。在本地,我使用flyway.properties 文件来设置所有相同的参数。

以上是关于Postgres JDBC连接作为应用程序用户而不是系统用户的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 JDBC 连接为 Postgres 设置会话变量吗

Android 无法直接连接 Postgres 数据库,也无法使用 JDBC 连接

只允许通过 sql server、oracle 和 postgres 中的 jdbc 更新表

Postgres中用户定义的连接功能?

postgres 上的错误转换连接

kafka JDBC源连接器无法获取postgres表