Inhaltsverzeichnis

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:

    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

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:

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