postgres_fdw 模块的 Postgresql 问题
Postgresql problems with postgres_fdw module
我正在尝试使用 PostgreSQL Maestro 工具将来自 "local" 数据库的外键引用到另一个数据库中的另一个主键(实际上,它们都在同一个远程服务器上机器)。
我听说过 postgres_fdw 模块创建一个外部 table 就像远程数据库中 table 的副本一样,但是当我尝试执行我的查询时我有这个错误:
"SQL Error: ERROR: referenced relation "foreign_olo" 不是 table"。
这是我的 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创建的外国table。
我已经尝试在 foreign_olo table 上提交一个 INSERT 或一个简单的 SELECT,并且一切顺利,所以我不明白为什么对于外键情况它不能识别为table。
谢谢大家帮帮我!
执行外键约束有两个部分:
- 子 table 上的
INSERT
(或 FK 字段的 UPDATE
)必须检查父记录是否存在。
- 父table上的
DELETE
(或PK字段的UPDATE
)必须检查不存在子记录。
FK 约束无法引用外部 table,因为无法执行第二个条件 - 远程服务器无法自动检查本地 table 中的记录.
您可以使用触发器相对轻松地实现第一次检查:
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 table 上创建一个类似的触发器来执行 update/delete 检查,但它需要另一个外部 table 在您的其他数据库中指向您的本地olo_config
.
我正在尝试使用 PostgreSQL Maestro 工具将来自 "local" 数据库的外键引用到另一个数据库中的另一个主键(实际上,它们都在同一个远程服务器上机器)。 我听说过 postgres_fdw 模块创建一个外部 table 就像远程数据库中 table 的副本一样,但是当我尝试执行我的查询时我有这个错误:
"SQL Error: ERROR: referenced relation "foreign_olo" 不是 table"。
这是我的 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创建的外国table。 我已经尝试在 foreign_olo table 上提交一个 INSERT 或一个简单的 SELECT,并且一切顺利,所以我不明白为什么对于外键情况它不能识别为table。 谢谢大家帮帮我!
执行外键约束有两个部分:
- 子 table 上的
INSERT
(或 FK 字段的UPDATE
)必须检查父记录是否存在。 - 父table上的
DELETE
(或PK字段的UPDATE
)必须检查不存在子记录。
FK 约束无法引用外部 table,因为无法执行第二个条件 - 远程服务器无法自动检查本地 table 中的记录.
您可以使用触发器相对轻松地实现第一次检查:
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 table 上创建一个类似的触发器来执行 update/delete 检查,但它需要另一个外部 table 在您的其他数据库中指向您的本地olo_config
.