PostgreSQL 故障排除

数据 API 生成器中常见 PostgreSQL 连接、架构和 SSL 问题的解决方案。

常见问题

DAB 中的 PostgreSQL 支持是什么?

数据 API 生成器支持 PostgreSQL 作为关系数据库后端。 DAB 使用 Npgsql 驱动程序进行连接,并将 REST 和 GraphQL 请求转换为 SQL 查询。 支持自承载 PostgreSQL 实例和托管服务,例如 Azure Database for PostgreSQL。

PostgreSQL 使用的连接字符串格式是什么?

DAB 使用适用于 PostgreSQL 的 ADO.NET 样式连接字符串。 典型的字符串如下所示 Host=localhost;Port=5432;Database=mydb;Username=myuser;Password=mypassword;。 在data-source.connection-string字段中设置连接字符串,或在dab init中通过--connection-string传入dab-config.json

DAB 是否支持 PostgreSQL 架构?

是的。 DAB 支持非公共架构。 在实体的source字段中,使用格式schemaname.tablename显式引用架构(例如,sales.orders)。 连接字符串中配置的数据库用户必须对架构具有USAGE权限,并且对目标表具有SELECTINSERTUPDATEDELETE权限。

常见问题

无法连接到 PostgreSQL 容器

症状: DAB 无法启动,或出现类似的网络错误。

原因: PostgreSQL 容器端口未映射,或者容器尚未准备好接受连接。

分辨率: 确认容器正在运行 docker ps ,并将该端口 5432 映射到主机。 在 Host=localhost;Port=5432 连接字符串中使用。 如果容器刚刚启动,则允许 PostgreSQL 在启动 DAB 之前初始化几秒钟。

密码身份验证失败

症状: DAB 日志显示 28P01: password authentication failed for user

原因: 连接字符串中的用户名或密码不正确,或者 PostgreSQL 用户配置为其他身份验证方法,例如 peerident

分辨率: 验证凭据是否与创建 PostgreSQL 实例或容器时设置的凭据匹配。 对于容器,请检查 POSTGRES_PASSWORDPOSTGRES_USER 环境变量。 如果在本地运行,请确认 pg_hba.conf 是否允许连接主机使用 md5scram-sha-256 身份验证。

当实体引用非公共模式时找不到模式

症状: 即使数据库中存在这张表,DAB 也会返回 relation "tablename" does not exist 错误。

原因: 实体的 source 字段省略架构前缀,因此 PostgreSQL 默认仅 public 搜索架构。

解决方法:更新dab-config.json中的source值以包含架构前缀,例如sales.orders。 通过在psql中运行GRANT USAGE ON SCHEMA sales TO myuser;,确认数据库用户是否具有USAGE模式。

连接到 Azure Database for PostgreSQL 时出现 SSL 所需的错误

症状:与 Azure Database for PostgreSQL 的连接失败,错误信息为SSL connection is required

原因: Azure Database for PostgreSQL 默认强制实施 SSL。 不带 SSL 的连接将被拒绝。

分辨率: 追加 Ssl Mode=Require; 到连接字符串。 若要进行完整的证书验证,还应设置Trust Server Certificate=falseRoot Certificate=path/to/ca.pem,并提供服务器 CA 证书路径。 从 Azure 门户下载服务器 网络 设置下的证书捆绑包。

不支持存储过程

症状: 将 PostgreSQL 存储过程或函数配置为实体源失败,或者实体的行为不符合预期。

原因: 数据 API 生成器目前不支持 PostgreSQL 的存储过程。 这是 GitHub 问题 #1023 中跟踪的已知限制。

分辨率: 请改用表或视图作为实体源。 请关注 GitHub Issue,以获取有关何时添加 PostgreSQL 存储过程支持的更新。

不会对创建操作强制实施数据库策略

症状: 即使数据库策略应限制操作,创建突变或 POST 请求也会成功。

原因: 尚未实现对 PostgreSQL 中创建操作的数据库策略支持。 这是 GitHub 问题 #1334 中跟踪的已知限制。

解决方案: 使用基于角色的权限限制创建访问,直到支持 PostgreSQL 创建的数据库策略可用。

不会对 PUT 和 PATCH 操作强制实施数据库策略

症状: 即使数据库策略应限制它,PostgreSQL 实体上的 PUT 或 PATCH 请求也会成功。

原因: 尚未实现对 PostgreSQL 中的 PUT 和 PATCH 操作的数据库策略支持。 这是 GitHub 问题 #1372 中跟踪的已知限制。

解决方案: 使用基于角色的权限来限制更新访问,直到数据库策略支持 PostgreSQL 更新操作为止。

不支持Behalf-Of(OBO)身份验证

症状: 为 PostgreSQL 支持的 DAB 实例配置 On-Behalf-Of (OBO) 身份验证失败,或者令牌未按预期转发到数据库。

原因: 目前仅 SQL Server 和 Azure SQL 支持 OBO 身份验证。 尚未实现对 PostgreSQL、MySQL 和 Azure Cosmos DB 的支持。 这是 GitHub 问题 #3159 中跟踪的已知限制。

分辨率: 使用受支持的身份验证方法,例如 PostgreSQL 的连接字符串凭据或托管标识。 在 OBO 支持扩展到非 SQL Server 数据库时,请关注 GitHub 上的问题以获取更新。