+++
images = ['images/blog/postgresql.jpg']
categories = ['Soluzioni', 'Technology']
tags = ['Server', 'Database', 'PostgreSQL']
date = '2022-12-11'
lastmod = '2022-12-11'
title = 'Database link con PostgreSQL'
published = true
translationKey ='blog-postgresql-database-link'
slug = 'postgresql-database-link'
+++

In PostgreSQL è possibile creare dei database links e connettere due database separati, sia che
risiedano sullo stesso server o su servers separati, purchè siano accessibili tramite rete.

<!--more-->

La nomenclatura utilizzata è la seguente :

- ```serverorig``` : il server principale di origine
- ```databaseorig``` : il database sul server principale di origine
- ```serverdest``` : il server secondario di destinazione sul quale verrà creato il database link che punta a ```serverorig```
- ```schemaorig``` : lo schema di origine sul server principale
- ```schemadest``` : lo schema di destinazione sul server secondario

#### 1. Installazione dell'estensione
Il primo passo da compiere è installare su ```serverdest``` l'estensione ```postgres_fdw``` come utente ```postgres``` :

```sql
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
```
#### 2. Creazione utente per accesso tramite database link
Su ```serverorig``` creare un utente che consenta la connessione da ```serverdest``` e gli accessi
allo schema ```schemaorig``` e tabelle interessate. Per semplicità l'utente sarà ```userdest``` con
password ```passworddest``` e dovrà avere accesso alla tabella ```tableorig``` con i privilegi desiderati :
(```SELECT, INSERT, UPDATE, DELETE```)

#### 3. Creazione del database link
Su ```serverdest``` :
```sql
CREATE serverorig FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'serverorig', port 'portorig', dbname 'databaseorig');
``` 

Creare su ```serverdest``` il mapping per l'utente (```myuser```) che deve poter usare il database link

```sql
CREATE USER MAPPING FOR myuser SERVER serverorig OPTIONS ( user 'userdest' , password 'passworddest');
```
#### 5. Importare la struttura delle tabelle dallo schema principale ed assegnare i permessi
Su ```serverdest``` :

```sql
IMPORT FOREIGN SCHEMA schemaorig LIMIT TO (tableorig) FROM SERVER serverorig INTO schemadest;
GRANT ALL ON TABLE schemadest.tableorig TO myuser;
```
