informix:informix_fdw
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:
- `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
