Benutzer-Werkzeuge

Webseiten-Werkzeuge


informix:informix_fdw

IMPORT FOREIGN SCHEMA von Informix nach PostgreSQL

Vorbereitung

Zur besseren Nachverfolgung aktivieren wir das erweiterte Debugging:

SET client_min_messages TO DEBUG2;

Vollständiger IMPORT aller Tabellen eines Informix-Datenbank-Schemas

IMPORT FOREIGN SCHEMA daten
    FROM SERVER tcp_azur_Test
    INTO test
    OPTIONS (DATABASE 'test');

LIMITIERTER IMPORT (z. B. nur eine Tabelle)

IMPORT FOREIGN SCHEMA informix
    LIMIT TO (abfrage)
    FROM SERVER tcp_azur_Test
    INTO test
    OPTIONS (DATABASE 'test');

Hinweis:

  • `IMPORT FOREIGN SCHEMA` bezieht sich nicht auf das PostgreSQL-Schema, sondern auf den Owner der Tabellen im Informix-System.
  • Die Angabe wie z. B. `daten` ist ein Benutzer (Owner) in Informix, nicht der Name eines Schemas.
  • Beispielhafte vom Server generierte Abfrage:
    DEBUG:  PREPARE query "SELECT tabid, trim(owner), tabname FROM systables 
    WHERE tabid >= 100 AND owner = 'daten' 
    AND tabname IN ('abfrage') ORDER BY tabname DESC"
 

Wichtiger Hinweis zur Richtung des Imports

  • Ein `IMPORT FOREIGN SCHEMA` ist nur unidirektional möglich:

Von Informix nach PostgreSQL. Nicht umgekehrt! Ein Export oder Zugriff von Informix auf PostgreSQL über dieselbe Methode ist nicht möglich. Das Schema muss also zwingend auf Informix vorhanden sein! :!:

Kopieren der Tabellen lokal in PostgreSQL (struktur+daten)

Die folgende PL/pgSQL-Prozedur kopiert Tabellen aus dem per Foreign Schema importierten Schema (`quelle`) in ein lokales Zielschema (`ziel`).

Dabei wird:

  • das Zielschema ggf. neu angelegt,
  • jede Tabelle zuerst strukturell dupliziert (`LIKE … INCLUDING ALL`),
  • anschließend werden die Daten kopiert.
  • Bei einem Fehler wird trotzdem die leere Tabelle erstellt (zur späteren Analyse oder Wiederholung).
CREATE OR REPLACE PROCEDURE db.kopie(
    IN quelle TEXT,
    IN ziel TEXT)
LANGUAGE 'plpgsql'
AS $$
DECLARE
    tabelle TEXT;
BEGIN
    -- Schema prüfen und ggf. erstellen
    PERFORM 1 FROM information_schema.schemata WHERE schema_name = ziel;
    IF NOT FOUND THEN
        EXECUTE format('CREATE SCHEMA %I', ziel);
    END IF;
 
    -- Tabellenstruktur kopieren
    FOR tabelle IN
        SELECT TABLE_NAME
        FROM information_schema.tables
        WHERE table_schema = quelle
    LOOP
        EXECUTE format('DROP TABLE IF EXISTS %I.%I', ziel, tabelle);
        RAISE NOTICE 'Struktur % verarbeitet', tabelle;
        EXECUTE format(
            'CREATE TABLE %I.%I (LIKE %I.%I INCLUDING ALL)',
            ziel, tabelle, quelle, tabelle
        );
    END LOOP;
 
    -- Daten kopieren mit Fehlerbehandlung
    FOR tabelle IN
        SELECT TABLE_NAME
        FROM information_schema.tables
        WHERE table_schema = quelle
    LOOP
        BEGIN
            EXECUTE format('INSERT INTO %I.%I SELECT * FROM %I.%I',
                           ziel, tabelle, quelle, tabelle);
            RAISE NOTICE 'Tabelle % verarbeitet', tabelle;
        EXCEPTION WHEN OTHERS THEN
            RAISE NOTICE '------------ FEHLER bei % --------------', tabelle;
            COMMIT;
        END;
    END LOOP;
END;
$$;
 
ALTER PROCEDURE db.kopie(text, text)
    OWNER TO postgres;

Zusammenfassung

  • `IMPORT FOREIGN SCHEMA` erlaubt das Einbinden externer Informix-Tabellen als *Foreign Tables* in PostgreSQL.
  • Ein vollständiger Import kann auf Wunsch auf einzelne Tabellen beschränkt werden.
  • Für dauerhafte Nutzung oder Fehlerunabhängigkeit empfiehlt sich die Kopie der Tabellen lokal via PL/pgSQL.
  • Der Prozess ist einseitig – nur von Informix zu PostgreSQL möglich.
informix/informix_fdw.txt · Zuletzt geändert: von Thomas Schilling