【问题标题】:Delphi/FireDAC using default schema instead of search_path on insert/update commands in PostgresDelphi/FireDAC 在 Postgres 的插入/更新命令中使用默认模式而不是 search_path
【发布时间】:2019-01-09 23:25:48
【问题描述】:

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

我们使用 Postgres 数据库并定义了几个 模式。每个用户都定义了一个 Postgres Search_path,到目前为止我们主要使用的是 schema1。

例子:

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

现在,在 Delphi 中,所有查询和表都是在没有架构的情况下定义的(我们都认为 search_path 正在做它的工作),虽然我们只使用架构 1,但一切正常。

但每当我使用来自 schema2 或 schema3 的表时,只有 Open 操作按预期工作。 即使 tableX 是不同的架构,发布也会失败并出现错误“关系“schema1.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.

发布操作应该失败,并出现错误“关系“schema1.table3”不存在”。

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;

【问题讨论】:

  • 无法在 Delphi 10.2 (.0) 和 PostgreSQL 10.1 (build 1800) 上重现。我执行了类似SELECT * FROM mytable 的SQL 命令,其中mytable 是在我登录的用户的search_path 中列为第二个架构下定义的表。然后我尝试Append 一个元组和Post 更改。元组被插入。那是你的工作流程吗?如果是这样,您使用哪些版本?如果不是,请您澄清一下吗?
  • 感谢您指出 - 我用我正在使用的版本更新了我的问题。
  • 好吧,那么我们有类似的环境(如果不一样的话)。我无法重现这件事。我能够OpenTFDQuery 使用命令从schema2 中声明的表中获取元组,而无需在命令中提及模式。打开很好,所以Append,修改和Post。能详细说明一下步骤吗?或者最好发布一个 MVCE,好吗?
  • 嗯,这是一个难题...我将尝试创建一个最小的示例...顺便说一句,您的 FDConnection 是如何设置的?
  • 就像Database=MyDatabase; User_Name=user1; Password=12345; DriverID=PG。甚至在设计时使用定义的列和字段尝试了TDBGrid。仍然没有问题。可以正常编辑。

标签: postgresql delphi schema firedac


【解决方案1】:

public 放在其余方案之前:

ALTER DATABASE DBName SET search_path TO public, schema1, schema2

【讨论】:

  • 每篇文章都必须用英文写。
  • 哈!已经两年了......我已经解决了这个问题,但是是的......这已得到证实。有用!!谢谢你,伙计!
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多