1

PostgreSQL Maestro ツールを使用して、「ローカル」DB からの外部キーを他の DB 内の他の主キーに参照しようとしています (実際には、両方とも同じリモート マシン上にあります)。リモート 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 をコミットしようとしましたが、すべてうまくいったので、外部キーの場合にテーブルとして認識できない理由がわかりません。みんなありがとう!

4

1 に答える 1

1

外部キー制約の適用には、次の 2 つの部分があります。

  • 子テーブルのINSERT(またはUPDATEFK フィールドの) は、親レコードが存在することを確認する必要があります。
  • 親テーブルのA DELETE(またはUPDATEPK フィールドの) は、子レコードが存在しないことを確認する必要があります。

この 2 番目の条件を強制することは不可能であるため、外部テーブルを 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

于 2016-04-28T07:37:37.760 に答える