Using Foreign Data Wrappers

1. Understanding Foreign Data Wrappers

ConceptDetail
FDWSQL gateway to external data
ServerConnection definition
User MappingLocal role → remote credentials
Foreign TableLocal schema object that reads remote

2. Installing postgres_fdw Extension

CREATE EXTENSION postgres_fdw;

3. Creating Foreign Server

CREATE SERVER analytics_srv
   FOREIGN DATA WRAPPER postgres_fdw
   OPTIONS (host 'analytics.db.example.com', port '5432', dbname 'warehouse');

4. Creating User Mapping

CREATE USER MAPPING FOR app_writer SERVER analytics_srv
   OPTIONS (user 'reporter', password 'secret');

5. Creating Foreign Table

CREATE FOREIGN TABLE fact_orders (
   id bigint, customer_id bigint, total_cents bigint, placed_at timestamptz
) SERVER analytics_srv OPTIONS (schema_name 'public', table_name 'orders');

6. Importing Foreign Schema

IMPORT FOREIGN SCHEMA public
   LIMIT TO (orders, customers)
   FROM SERVER analytics_srv INTO ext;

7. Querying Foreign Tables

EXPLAIN SELECT count(*) FROM fact_orders WHERE placed_at > now() - interval '7 days';
-- Foreign Scan pushes WHERE down to remote when use_remote_estimate=on

8. Using file_fdw

CREATE EXTENSION file_fdw;
CREATE SERVER files FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE access_log (ts text, ip text, path text)
   SERVER files OPTIONS (filename '/var/log/access.tsv', format 'text', delimiter E'\t');
CREATE EXTENSION dblink;
SELECT *
  FROM dblink('host=remote dbname=app user=u password=p',
              'SELECT id, name FROM customers')
       AS t(id int, name text);

10. Listing Foreign Servers

\des+
SELECT srvname, srvoptions FROM pg_foreign_server;

11. Listing User Mappings

\deu+
SELECT * FROM pg_user_mappings;

12. Listing Foreign Tables

\det+
SELECT foreign_table_schema, foreign_table_name FROM information_schema.foreign_tables;

13. Dropping Foreign Table

DROP FOREIGN TABLE fact_orders;

14. Dropping Foreign Server

DROP USER MAPPING FOR app_writer SERVER analytics_srv;
DROP SERVER analytics_srv CASCADE;