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
我已经使用 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