PG WORKSHOP

Foreign data wrappers (fdw til PostgreSQL

En fdw er en extension til PostgreSQL

Med foreign data wrappers (fdw) er det enkelt at tilføje data fra andre datakilder til PostgreSQL. Datakilder kan være hvad som helst som f.eks. tesktfiler,csv filer, webservices, andre databaser eller andre PostgreSQL databser. Der findes mange 3 parts fdw'er og enkelte indbyggede i PostgresSQL kernen.

Fdw's kan således også anvende stil dataimport fra andre systemer, hvor man traditionelt ville have anvendt dump/restore eller ETL værktøjer, herunder ogr2ogr Med en FDW er "fremmede" data direkte indlejret i databasen.

Det giver også mulighed for at gradvist migrere fra Oracle til PstgreSQL

se mere på:

https://wiki.postgresql.org/wiki/Foreign_data_wrappers

http://www.postgresql-sessions.org/en/4/start

Indbyggede i PostgreSQL er :

Postgres_fdw

Kan bruges til at forbinde til at andre PostgreSQL databaser

File_fdw

Kan bruges til oprette forbidnelse til CSV fil som om det var en tabel i databasen

Af trejdeparts Findes bl.a.

Oracle

Der arbejdes på højtryk på Spatial support med denne fdw: https://github.com/laurenz/oracle_fdw/issues/5

Man kan tilbyde at hjælpe med finansieringen

ODBC

Er et eksempel på hvordan ODBC kan bruges mod SQL server:

http://www.postgresonline.com/journal/archives/249-ODBC-Foreign-Data-wrapper-to-query-SQL-Server-on-Window---Part-2.html

http://multicorn.org/

Multicorn er den datawrapper til mange forskellige RDMBS'er samt filer,rss feeds m.m. Er skrevet i Python og egne fdw'er skulle være "rimelig enkle at skrive.

Eksempel: Oracle Foreign Data Wrapper


create extension oracle_fdw;

CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw
          OPTIONS (dbserver '//10.211.55.5/xe');


GRANT USAGE ON FOREIGN SERVER oradb TO mbj

CREATE USER MAPPING FOR mbj SERVER oradb
          OPTIONS (user 'septimadb', password 'septima4you');

-- Der er andre authentification metoder

DROP  FOREIGN TABLE IF EXISTS oracle.demo_orders;
CREATE FOREIGN TABLE oracle.demo_orders (
          ORDER_ID        integer           OPTIONS (key 'true')  NOT NULL,
          CUSTOMER_ID   numeric,
          ORDER_TOTAL   numeric,
          ORDER_TIMESTAMP date,
          USER_ID    integer

       ) SERVER oradb OPTIONS (table 'DEMO_ORDERS');


-- Vi kan læse fra tabellen
SELECT * FROM oracle.demo_orders;

--- Vi kan opdatere til tabellen
UPDATE oracle.demo_orders SET order_total = 666 WHERE order_id = 1

--- VI kan oprette i tabellen

INSERT INTO oracle.demo_orders (order_id, customer_id, order_total,order_timestamp,user_id) VALUES(777, 2, 999,'2014-09-28', 2)

Eksempel: PostgreSQL Foreign Data Wrapper


CREATE EXTENSION postgres_fdw;

CREATE SERVER pg_asiaq
 FOREIGN DATA WRAPPER postgres_fdw
  OPTIONS (host 'localhost', port '5432', dbname 'asiaq');

CREATE USER MAPPING FOR public SERVER
     pg_asiaq
     OPTIONS (user 'mbj', password '123Portal');


DROP FOREIGN TABLE IF EXISTS asiaq.bygninger;

--Dette kan være udvalgte kolnner fra tabellen
 CREATE FOREIGN TABLE asiaq.bygninger (
  id serial,
  geom geometry(Polygon,32622),
  "Info" character varying(50),
  "Objekttype" character varying(50),
  "Z" double precision,
  "Konverteret" character varying(16)

)
 SERVER pg_asiaq OPTIONS (schema_name 'att0902', table_name 'bygninger');

SELECT * FROM asiaq.bygninger;

-- Vi kan opdatere
UPDATE asiaq.bygninger SET "Z" = 99.99 WHERE id=1
SELECT * FROM asiaq.bygninger;

-- Vi kan slette
DELETE FROM asiaq.bygninger WHERE id =1

-- Vi kan orpette nye records
INSERT INTO ASIAQ.bygninger(
            geom, "Info", "Objekttype", "Z", "Konverteret")
    VALUES (ST_GeomFromText('POLYGON((390309.70572787 7538535.16303447,390306.811436522 7538533.90329089,390307.759708616 7538531.72373453,390304.79120467 7538530.44399502,390308.015329789 7538522.94552131,390322.478540685 7538529.21424533,390319.097744523 7538536.62273735,390310.637508276 7538532.97348015,390309.70572787 7538535.16303447))',32622),
     '--', 'SKUR', 66.66, '20110110');

SELECT * FROM asiaq.bygninger;