PostgreSQL realizuje części specyfikacji SQL/MED, co pozwala na dostęp do danych które znajdują się na poza bazą PostgeSQL za pomocą zwykłych zapytań SQL. Takie dane są określane jako „dane obce” (ang. foreign data). (Nie ma to żadnego związku z kluczami obcymi, które są rodzajem przymusu w bazie danych.)
Dosęp do danych obcych jest możliwy przy pomocy „wraperów danych obcych” (ang. foreign data wrapper). Wrapper danych obcych to biblioteka, która może komunikować się z zewnętrznym źródłem danych, ukrywając szczegóły połączenia ze źródłem i uzyskiwania z niego danych. Istnieje kilka wbudowanych wrperów danych obcych dostępnych jak na przykład postgres_fdw lub file_fdw. A Jeśli nie uda się znaleźć gotowego wrapera dla danego typu danych obcych to można go napisać samemu.
Aby uzyskać dostęp do danych obcych, trzeba utworzyć obiekt serwera obcego (ang. foreign server), który określa, jak podłączyć się do konkretnego zewnętrznego źródła danych, zgodnie z zestawem opcji wymaganych przez używany wraper danych obcych. Następnie należy utworzyć jedną lub więcej tabel obcych, które definiują strukturę danych zdalnych. Tabele obcą można wykorzystywać w zapytaniach jak normalną tabele, ale tabela obca oczywiście nie jest przechowywana przez PostgreSQL, a więc zawsze, gdy jest ona używana, PostgreSQL prości wrapper danych obcych o pobranie danych z zewnętrznego źródła, lub przesyłanie danych do zewnętrznego źródła, w przypadku poleceń aktualizacji.
Zdaly dostęp do danych może wymagać uwierzytelniania do zewnętrznego źródła danych. Ta informacja może być dostarczana przez mapowanie użytkownika, który może dostarczyć dodatkowe dane, takie jak nazwy użytkownika i hasło na podstawie aktualnej roli PostgreSQL.
Ale do czego można to wykorzystać?
Oczywiście pierwsze co nasuwa się na myśl to uniknięcie wpychania BLOBów do bazy, a jednocześnie pozostawienie sobie możliwości manipulowania nimi tak jakby w niej były. Co jeszcze? – Podłączając tymczasowo plik CSV lub tekstowy za pomocą wrapera file_fdw można jego zawartością manipulować równie łato jak zawartością tabeli w bazie. A dzięki gotowemu wraperowi postgres_fdw można manipulować danymi zwartymi w rużnych bazach tak jak by to była jedna baza, można to też wykorzystać do rozproszenia bazy na kilka maszyn fizycznych/klastrów PostgreSQL. Możliwości można by mnożyć w nieskończoność…