Introduction
Foreign data wrappers let you access data stored outside your database as if it were inside. This helps you work with different data sources easily.
Jump into concepts and practice - no test required
CREATE EXTENSION IF NOT EXISTS postgres_fdw; CREATE SERVER server_name FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'host_address', dbname 'database_name', port '5432'); CREATE USER MAPPING FOR local_user SERVER server_name OPTIONS (user 'remote_user', password 'remote_password'); IMPORT FOREIGN SCHEMA public FROM SERVER server_name INTO local_schema; -- Or create foreign table manually: CREATE FOREIGN TABLE local_schema.table_name ( column1 datatype, column2 datatype ) SERVER server_name OPTIONS (schema_name 'public', table_name 'remote_table');
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.1.10', dbname 'remotedb', port '5432');
CREATE USER MAPPING FOR CURRENT_USER SERVER myserver OPTIONS (user 'remoteuser', password 'secret');
IMPORT FOREIGN SCHEMA public FROM SERVER myserver INTO local_schema;
CREATE EXTENSION IF NOT EXISTS postgres_fdw; CREATE SERVER remoteserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'foreign_db', port '5432'); CREATE USER MAPPING FOR CURRENT_USER SERVER remoteserver OPTIONS (user 'foreign_user', password 'foreign_pass'); CREATE FOREIGN TABLE foreign_table ( id integer, name text ) SERVER remoteserver OPTIONS (schema_name 'public', table_name 'people'); SELECT * FROM foreign_table;
myserver using the postgres_fdw wrapper?CREATE EXTENSION IF NOT EXISTS postgres_fdw; CREATE SERVER foreign_srv FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.1.10', dbname 'remotedb'); CREATE USER MAPPING FOR current_user SERVER foreign_srv OPTIONS (user 'remoteuser', password 'remotepass'); CREATE FOREIGN TABLE foreign_table (id INT, name TEXT) SERVER foreign_srv OPTIONS (schema_name 'public', table_name 'users'); SELECT * FROM foreign_table WHERE id = 1;
SELECT query do?CREATE FOREIGN TABLE foreign_table (id INT, name TEXT) SERVER foreign_srv OPTIONS (schema_name 'public', table_name 'users');
ERROR: foreign server "foreign_srv" does not existorders and a remote table customers accessed via FDW named cust_fdw. Which approach correctly joins these tables in PostgreSQL?SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id; uses FDW foreign table and a direct join, which is correct and efficient. Copy remote customers data into a local table, then join locally copies data manually, less dynamic. Use dblink to fetch customers data inside a subquery, then join with orders uses dblink, more complex. Create a view combining orders and customers on the remote server creates a view on remote server, not accessible locally.