【发布时间】: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更改。元组被插入。那是你的工作流程吗?如果是这样,您使用哪些版本?如果不是,请您澄清一下吗? -
感谢您指出 - 我用我正在使用的版本更新了我的问题。
-
好吧,那么我们有类似的环境(如果不一样的话)。我无法重现这件事。我能够
Open和TFDQuery使用命令从schema2中声明的表中获取元组,而无需在命令中提及模式。打开很好,所以Append,修改和Post。能详细说明一下步骤吗?或者最好发布一个 MVCE,好吗? -
嗯,这是一个难题...我将尝试创建一个最小的示例...顺便说一句,您的 FDConnection 是如何设置的?
-
就像
Database=MyDatabase; User_Name=user1; Password=12345; DriverID=PG。甚至在设计时使用定义的列和字段尝试了TDBGrid。仍然没有问题。可以正常编辑。
标签: postgresql delphi schema firedac