postgres_fdw模块的Postgresql问题



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

"SQL 错误: 错误: 引用的关系 'foreign_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,一切顺利,所以我不明白为什么对于外键情况,它不能被识别为表。谢谢大家会帮我一把!

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

  • 子表上的INSERT(或 FK 字段的UPDATE)必须检查父记录是否存在。
  • 父表上的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

相关内容

  • 没有找到相关文章

最新更新