Delphi/FireDAC 在 Postgres 中的 insert/update 命令上使用默认架构而不是 search_path

Delphi/FireDAC using default schema instead of search_path on insert/update commands in Postgres

我已经使用 FireDAC 几年了,不知何故这个问题从未出现过。

我们正在使用 Postgres 数据库,其中定义了几个 schemas。每个用户都有一个 Postgres Search_path 定义,到目前为止我们主要使用 schema1.

示例:

ALTER ROLE user1 SET search_path = schema1, schema2, schema3;

现在,在 Delphi 中,所有查询和 table 都是在没有模式的情况下定义的(我们都认为 search_path 正在做它的工作) 并且当我们只使用 schema1 时一切正常。

但是每当我使用来自 schema2 或 schema3 的 table 时,只有 Open 操作按预期工作。 Post 失败并显示错误 'relation "schema1.tableX" does not exist' 即使 tableX 是不同的架构。

Relation does not exist 我在这里错过了什么?提前谢谢大家...

我正在使用 Delphi Tokyo 和 Postgres 10.1,数据集已连接到 DevExpress 网格。此外,这种行为在两个使用不同模式的独立应用程序上是可以验证的……好吧,这部分可能是可以理解的,因为它们都是由我开发和更新的。

可能的重复步骤:

Postgres:
        ALTER ROLE user1 SET search_path = schema1, schema2; -- Default schema is schema1

    schema1.table1
    schema1.table2

    schema2.table3
    schema2.table4

Delphi:
table3.Tablename := 'table3';

table3 is connected to a TcxGrid via a Datasource.

table3.Open;

Then use either GUI or code to edit/insert a record.

Post 操作应该失败并出现错误 'relation "schema1.table3" does not exist'。

Sample project - just enter connection credentials and enter non-default schema tablename

DDL:
CREATE DATABASE "AsystSQLProd"
  WITH OWNER = "AsystSQL"
       ENCODING = 'UTF8'
       TABLESPACE = ts_asyst_data
       LC_COLLATE = 'C'
       LC_CTYPE = 'C'
       CONNECTION LIMIT = -1;

GRANT ALL ON DATABASE "AsystSQLProd" TO "AsystSQL";
GRANT CONNECT, TEMPORARY ON DATABASE "AsystSQLProd" TO "AsystSupportRole";
GRANT CONNECT, TEMPORARY ON DATABASE "AsystSQLProd" TO "AsystLicensingRole";
GRANT CONNECT, TEMPORARY ON DATABASE "AsystSQLProd" TO "AsystFitRole";
GRANT CONNECT, TEMPORARY ON DATABASE "AsystSQLProd" TO "AsystMatRole";
REVOKE ALL ON DATABASE "AsystSQLProd" FROM public;


CREATE SCHEMA fit AUTHORIZATION "AsystSQL";

GRANT ALL ON SCHEMA fit TO "AsystSQL";
GRANT ALL ON SCHEMA fit TO "AsystFitRole";
GRANT USAGE ON SCHEMA fit TO "AsystLicensingRole";
GRANT USAGE ON SCHEMA fit TO "AsystSupportRole";

CREATE SCHEMA mat AUTHORIZATION "AsystSQL";

GRANT ALL ON SCHEMA mat TO "AsystSQL";
GRANT ALL ON SCHEMA mat TO "AsystMatRole";


CREATE USER andrejg WITH
  LOGIN
  NOSUPERUSER
  INHERIT
  NOCREATEDB
  NOCREATEROLE
  NOREPLICATION
  VALID UNTIL 'infinity'

GRANT 
  "AsystFitRole", 
  "AsystMatRole", 
  "AsystSupportRole" TO andrejg;

ALTER USER andrejg SET search_path TO mat, sup, fit;

public放在其余方案之前:

ALTER DATABASE DBName SET search_path TO public, schema1, schema2