====== Veloce introduzione a PostgreSQL ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **// 14/06/2023 - 17:59 //** // // Andremo installare su una macchina Arch Linux il suddetto database e renderlo operati con un database contenente una tabella. ===== Installazione su Arch Linux ===== sudo pacman -S postgresql Il pacchetto installera' i tutti file necessari a postgresql e creera' un utente di sistema di nome "postgres" . ===== Loggarsi come utente di sistema postgres ===== sudo -u postgres -i Sara' opportuno mettere una password. ===== Inizializzare Postgresql ===== La prima volta è necessario configurare il database con il locale e la cartella contenente i file dei nostri db. initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data' ===== Avviare Postgresql ===== sudo systemctl start postgresql.service ===== Creare il primo utente di Postgresql ===== Postgresql ha creato un utente di default (del db) con capacita' amministrative chiamato postgres (come l'utente di sistema che lancia il processo).Noi adesso andremo a creare un nostro utente attraverso l'utility da riga di comando interattiva: createuser --interactive Assegnare una password all'utente da shell (comando "psql" avviato da utente postgres) ALTER USER mioutente WITH PASSWORD 'miapassword' ===== Creare un database ===== Creeremo un database di nome "test0" assegnando la proprieta' a un utente : createdb test0 -U ===== Accedere al db ===== Da utente postgres impartiamo il seguente comando psql ===== Dove si trovano i file di configurazione di Postgresql? ===== I file sono essenzialmente 2 e si trovano su Arch in queste percorsi: /var/lib/postgres/data/postgresql.conf (Configurazione principale) /var/lib/postgres/data/pg_hba.conf (Permessi di accesso da locale e da rete) Se si vuole rendere postgresql accessibile a chiunque da rete basta aggiungere questa riga a **pg_hba.conf**: host all all all trust e assicurarsi che sia presente in **postgresql.con** la direttiva: listen_addresses = '*' Una volta modificati i file si deve riavviare il demone con: sudo systemctl restart postgresql.service ===== Creare tabelle e popolare di dati ===== Creiamo una tabella con i campi id,nome,cognome,email con id chiave primaria autoincrementante. CREATE TABLE persone( id SERIAL PRIMARY KEY, nome VARCHAR (50) , cognome VARCHAR (50) , email VARCHAR (355) ); Inseriamo qualche dato: insert into persone (nome, cognome, email) values ('Fabio','Di Matteo','fabio@mail.com') ; ===== Utenti ===== Logghiamoci con l'utente di sistema postgres sudo -u postgres -i ==== Comandi da terminale per gestire gli utenti ==== ^Comando^Descrizione^ |createuser --interactive|Crea un utente | |dropuser |Cancella un utente | ==== Comandi SQL per gestire gli utenti ==== Lanciamo ''psql'' per digitare i seguenti comandi. ^Comando^Descrizione^ |\du|Elenco utenti| |SELECT rolname FROM pg_roles;|Elenco utenti| |CREATE ROLE name ;|Crea un utente/ruolo (non abilita al login)| |CREATE USER utente PASSWORD 'password'|Crea un utente, assegna una password e lo abilita al login| |ALTER USER mioutente WITH PASSWORD 'miapassword'|sovrascrive password utente| ===== Database ===== Di seguito alcuni comandi per gestire i database. Lanciamo ''psql '' per digitare i seguenti comandi. ^Comando^Descrizione^ |\l|elenca i database| |dropdb |elimina un database. Comando da impartire in shell di sistema| |\d+ |Descrive la stuttura della tabella| |\dp|Elenca i privilegi degli utenti sulle tabelle del database| |\dp |elenca i privilegi degli utenti sulla tabella| |GRANT SELECT ON TO ;| da il privilegio di fare select all'utente nella tabella| |GRANT ALL PRIVILEGES ON TO ;|Da tutti i privilegi sulla tabella all'utente| |GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO ;|da tutti i privilegi di scrittura e lettura all'utente sull'intero database | |GRANT USAGE, SELECT ON SEQUENCE TO ;|Da i permessi all'utente per poter utilizzare l'autoincremento | |GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ;|Da i permessi all'utente di utilizzare tutti gli autoincrementi dello schema public| |REVOKE SELECT ON FROM ;|revoca il privilegio di fare select all'utente nella tabella| |REVOKE ALL PRIVILEGES ON FROM ;|Revoca tutti i privilegi all'utente sulla tabella| |REVOKE SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM ;|revoca tutti i privilegi di scrittura e lettura all'utente sull'intero database| ===== Alterare struttura tabelle ===== Di seguito alcuni comandi per gestire le tabelle. Lanciamo psql per digitare i seguenti comandi. ^Comando^Descrizione^ |ALTER TABLE RENAME TO ;|Rinomina una tabella| |ALTER TABLE RENAME COLUMN TO ;|Rinomina colonna di una tabella| |ALTER TABLE ADD COLUMN varchar(30);|Aggiunge una nuova colonna alla tabella| |ALTER TABLE DROP COLUMN RESTRICT;|Elimina una colonna dalla tabella| |ALTER TABLE ALTER COLUMN TYPE varchar(100);|Cambia il tipo di dato di una colonna| ===== Abilitare il supporto a Openssl ===== Postgresql permette di cifrare le connessioni grazie a openssl (se abilitato in compilazione). Vediamo come attivarlo. Prima di tutto dobbiamo creare la chiave privata e il certificato del server (privkey.pem server.req): openssl req -new -text -out server.req Inseriamo la passphrase per la chiave privata e tutto quello che ci viene chiesto interattivamente.Possiamo ignorare 'challenge password' . \\ \\ Evitiamo che postgres chieda la passphrase ogni volta che si avvia: openssl rsa -in privkey.pem -out server.key rm privkey.pem openssl req -x509 -in server.req -text -key server.key -out server.crt Adesso diamo i permessi a chiavi e certificati: chmod og-rwx server.key Copiare i file generati nella cartella data di postgres e assegnare il proprietario all'utente "postgres" : chown postgres server.crt server.key server.req Assicurarsi che la sezione "ssl" della configurazione del server risulti così: ssl = on # (change requires restart) ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers # (change requires restart) ssl_prefer_server_ciphers = on # (change requires restart) ssl_ecdh_curve = 'prime256v1' # (change requires restart) ssl_cert_file = '/var/lib/postgres/data/server.crt' # (change requires restart) ssl_key_file = '/var/lib/postgres/data/server.key' # (change requires restart) #ssl_ca_file = '' # (change requires restart) #ssl_crl_file = '' # (change requires restart) password_encryption = on db_user_namespace = off row_security = on Aggiungere infine la regola a '/var/lib/postgres/data/pg_hba.conf' per far connettere gli utenti (in questo caso tutti) tramite ssl: hostssl all all all trust ===== Backup/restore ===== Fare il backup di un intero database su un file di testo: pg_dump miodb > outfile.sql Restore del databse: psql --set ON_ERROR_STOP=on miodb < infile.sql Se volessimo copiare direttamente un db su un'altro: pg_dump -h host1 dbname | psql -h host2 dbname