2016-04-27 5 views
1

Я пытаюсь использовать средство Maestro PostgreSQL для ссылки на внешний ключ, поступающий из «локальной» БД на другой первичный ключ внутри другой БД (фактически, они оба находятся на одном и том же удаленная машина). Я слышал о модуле postgres_fdw, чтобы создать внешнюю таблицу, которая действует как копия таблицы внутри удаленной БД, но когда я пытаюсь выполнить мой запрос, у меня есть эта ошибка:Проблемы с Postgresql с модулем 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. Я попытался зафиксировать INSERT или простой SELECT в таблице foreign_olo, и все прошло хорошо, поэтому я не могу понять, почему для внешнего ключа он не может быть распознан как таблица. Спасибо всем, кто дал бы мне руку!

ответ

0

Есть две части соблюдения ограничения внешнего ключа:

  • INSERT (или UPDATE поля FK) на столе ребенка должны проверить, что родительская запись существует.
  • A DELETE (или UPDATE поля PK) в родительской таблице должно проверить, нет ли дочерней записи.

Внешние таблицы не могут быть связаны ограничениями 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(); 

Вы можете создать подобный триггер на столе ПК, чтобы сделать обновление/удалить проверку, но это потребует другой иностранной таблицы в другая база данных, которая указывает на ваш местный olo_config.

+0

спасибо! – JinLemon

Смежные вопросы