首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi/FireDAC对Postgres中的insert/update命令使用默认模式代替search_path

Delphi/FireDAC对Postgres中的insert/update命令使用默认模式代替search_path
EN

Stack Overflow用户
提问于 2018-08-02 08:50:08
回答 1查看 907关注 0票数 0

我已经使用FireDAC几年了,但不知怎么的,这个问题从来没有出现过。

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

示例:

代码语言:javascript
复制
ALTER ROLE user1 SET search_path = schema1, schema2, schema3;

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

但是,每当我使用来自schema2或schema3的表时,只有打开操作才能按预期工作。尽管是一个不同的模式,但错误‘关系“"schema1.tableX”不存在,tableX Post失败。

关系不存在,我在这里错过了什么?谢谢大家提前..。

我使用Delphi东京和Postgres10.1,数据集连接到DevExpress网格。此外,此行为可在两个使用不同模式的独立应用程序上验证.嗯,这部分可能是可以理解的,因为它们都是由我开发和更新的。

重复此操作的可能步骤:

代码语言:javascript
复制
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操作应该失败,错误的关系"schema1.table3“不存在。

示例项目-只需输入连接凭据并输入非默认模式表名即可。

代码语言:javascript
复制
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;
EN

Stack Overflow用户

回答已采纳

发布于 2021-02-21 17:02:22

public放在其他计划之前:

代码语言:javascript
复制
ALTER DATABASE DBName SET search_path TO public, schema1, schema2
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51649400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档