Database postgres_fdw模块的Postgresql问题

Database postgres_fdw模块的Postgresql问题,database,postgresql,foreign-keys,postgres-fdw,Database,Postgresql,Foreign Keys,Postgres Fdw,我正在尝试使用PostgreSQL Maestro工具,将来自“本地”DB的外键引用到另一个DB中的另一个主键(实际上,它们都在同一台远程机器上)。 我听说postgres_fdw模块可以创建一个外部表,该表在远程数据库中充当表的副本,但当我尝试执行查询时,出现以下错误: SQL错误:错误:引用的关系“foreign\u olo”不是表 这是我的sql代码: CREATE TABLE edb.olo_config ( primary_key integer NOT NULL PR

我正在尝试使用PostgreSQL Maestro工具,将来自“本地”DB的外键引用到另一个DB中的另一个主键(实际上,它们都在同一台远程机器上)。 我听说postgres_fdw模块可以创建一个外部表,该表在远程数据库中充当表的副本,但当我尝试执行查询时,出现以下错误:

SQL错误:错误:引用的关系“foreign\u olo”不是表

这是我的sql代码:

CREATE TABLE edb.olo_config (  
primary_key       integer NOT NULL PRIMARY KEY,
puntamento        varchar,
mail_contatto_to  varchar,
mail_contatto_cc  varchar,
/* Foreign keys */
CONSTRAINT olo_code
  FOREIGN KEY (olo_code)
  REFERENCES edb.foreign_olo(codice_operatore)
) WITH (
  OIDS = FALSE
);
foreign_olo是我用postgres_fdw创建的外部表。 我曾尝试在foreign_olo表上提交一个INSERT或一个简单的SELECT,但一切都进行得很顺利,因此我无法理解为什么在外键的情况下它不能被识别为表。
谢谢大家能帮我一把

强制外键约束有两个部分:

  • 子表上的
    插入
    (或FK字段的
    更新
    )必须检查父记录是否存在
  • 父表上的
    DELETE
    (或PK字段的
    UPDATE
    )必须检查是否不存在子记录
FK约束无法引用外部表,因为第二个条件无法强制执行-远程服务器无法自动检查本地表中的记录

使用触发器可以相对轻松地执行第一次检查:

CREATE FUNCTION edb.olo_config_fk_trg() RETURNS TRIGGER AS
$$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM edb.foreign_olo
    WHERE codice_operatore = new.olo_code
    FOR KEY SHARE
  )
  THEN
    RAISE foreign_key_violation
      USING MESSAGE = 'edb.foreign_olo.codice_operatore="' || new.olo_code || '" not found';
  END IF;
  RETURN NULL;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER olo_config_fk_trg
AFTER INSERT OR UPDATE OF olo_code ON edb.olo_config
FOR EACH ROW EXECUTE PROCEDURE edb.olo_config_fk_trg();

您可以在PK表上创建一个类似的触发器来执行更新/删除检查,但它需要在您的其他数据库中创建另一个指向本地
olo_config

强制外键约束有两个部分:

  • 子表上的
    插入
    (或FK字段的
    更新
    )必须检查父记录是否存在
  • 父表上的
    DELETE
    (或PK字段的
    UPDATE
    )必须检查是否不存在子记录
FK约束无法引用外部表,因为第二个条件无法强制执行-远程服务器无法自动检查本地表中的记录

使用触发器可以相对轻松地执行第一次检查:

CREATE FUNCTION edb.olo_config_fk_trg() RETURNS TRIGGER AS
$$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM edb.foreign_olo
    WHERE codice_operatore = new.olo_code
    FOR KEY SHARE
  )
  THEN
    RAISE foreign_key_violation
      USING MESSAGE = 'edb.foreign_olo.codice_operatore="' || new.olo_code || '" not found';
  END IF;
  RETURN NULL;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER olo_config_fk_trg
AFTER INSERT OR UPDATE OF olo_code ON edb.olo_config
FOR EACH ROW EXECUTE PROCEDURE edb.olo_config_fk_trg();
您可以在PK表上创建一个类似的触发器来执行更新/删除检查,但它需要在其他数据库中创建另一个指向本地
olo\u config
的外部表