⌂ Bases de données
Fiche 12 sur 12

Vues, états de sortie et sauvegarde

Livrer un résultat exploitable, et protéger son travail.

Après cette fiche, vous saurez :

1Les vues

Une vue est une requête à laquelle on donne un nom. Ensuite, on l'utilise comme si c'était une table.

CREATE VIEW v_emprunts_en_cours AS
SELECT e.num_emprunt,
       lec.nom AS lecteur,
       lec.telephone,
       liv.titre AS livre,
       e.date_emprunt,
       e.date_prevue
FROM emprunts e
INNER JOIN lecteurs lec ON e.num_lecteur = lec.num_lecteur
INNER JOIN livres liv ON e.num_livre = liv.num_livre
WHERE e.date_retour IS NULL;

Et maintenant, cette requête compliquée s'interroge comme une table :

SELECT * FROM v_emprunts_en_cours ORDER BY date_prevue;

À retenir

Une vue ne stocke rien. Elle ne contient aucune donnée.

Chaque fois que vous l'interrogez, PostgreSQL réexécute la requête d'origine. Les résultats sont donc toujours à jour.

C'est un raccourci, pas une copie.

Une vue sert à…Exemple
Éviter de réécrire une requête compliquéeles emprunts en cours, utilisés dix fois par jour
Simplifier le travail des utilisateursun collègue interroge la vue sans savoir joindre trois tables
Masquer des colonnes sensiblesune vue du personnel sans la colonne salaire
-- Voir la liste des vues
SELECT table_name FROM information_schema.views
WHERE table_schema = 'public';

-- Modifier une vue existante
CREATE OR REPLACE VIEW v_emprunts_en_cours AS
SELECT ...;

-- Supprimer une vue
DROP VIEW v_emprunts_en_cours;

À retenir

Convention : préfixez vos vues par v_.

Dans l'arborescence de pgAdmin, les vues sont rangées séparément, sous Views et non sous Tables. Mais dans les requêtes, rien ne les distingue d'une table — d'où l'intérêt du préfixe.

2Les états de sortie

Un état de sortie est un document destiné à être lu par un humain : une liste imprimée, un récapitulatif mensuel, un courrier de rappel.

Attention

PostgreSQL n'a pas de générateur d'états intégré.

Contrairement à Microsoft Access, il n'y a pas d'assistant « Rapport ». C'est normal : PostgreSQL est un moteur de base de données, pas une suite bureautique.

Un état de sortie se construit donc en trois temps :

  1. une requête SQL qui produit exactement les bonnes colonnes, bien nommées et bien triées ;
  2. un export, en CSV ou par copier-coller ;
  3. la mise en forme finale dans un tableur ou un traitement de texte.

La partie qu'on évalue, c'est la première. C'est elle qui demande du métier.

Une requête d'état bien écrite

Comparez. Voici une requête techniquement correcte, mais inutilisable telle quelle :

SELECT * FROM emprunts WHERE date_retour IS NULL AND date_prevue < CURRENT_DATE;

Et voici le même besoin, en état de sortie :

SELECT lec.nom          AS "Nom",
       lec.prenom            AS "Prénom",
       lec.telephone         AS "Téléphone",
       liv.titre             AS "Titre du livre",
       e.date_prevue         AS "À rendre le",
       CURRENT_DATE - e.date_prevue AS "Jours de retard"
FROM emprunts e
INNER JOIN lecteurs lec ON e.num_lecteur = lec.num_lecteur
INNER JOIN livres liv ON e.num_livre = liv.num_livre
WHERE e.date_retour IS NULL
  AND e.date_prevue < CURRENT_DATE
ORDER BY "Jours de retard" DESC;
Résultat
Nom     | Prénom | Téléphone     | Titre du livre  | À rendre le | Jours de retard
--------+--------+---------------+-----------------+-------------+----------------
Benali  | Karim  | 0475 22 33 44 | Le Petit Prince | 2026-09-05  |               4

À retenir

Ce qui fait la différence :

Le second document se donne à un employé de la bibliothèque. Le premier, non.

3Exporter en CSV

Deux méthodes, selon ce que vous voulez faire.

Depuis pgAdmin

  1. Exécuter la requête Dans le Query Tool.
  2. Cliquer sur l'icône de téléchargement En haut à droite du panneau de résultats. Elle ressemble à une flèche vers le bas.
  3. Choisir les options Séparateur, encodage, en-têtes de colonnes. Gardez UTF-8 et cochez les en-têtes.
  4. Ouvrir dans un tableur Le fichier .csv s'ouvre dans Excel ou LibreOffice Calc.

Attention

Le piège du CSV dans Excel en Belgique.

Un CSV utilise la virgule comme séparateur. Or Excel en configuration belge attend le point-virgule, et interprète la virgule comme séparateur décimal.

Résultat : tout se retrouve dans une seule colonne, ou les montants sont massacrés.

La solution : choisissez le point-virgule comme séparateur dans pgAdmin, ou utilisez « Données → À partir d'un fichier texte » dans Excel plutôt qu'un double-clic.

Depuis le serveur : la commande COPY

COPY (
    SELECT lec.nom, lec.prenom, liv.titre, e.date_prevue
    FROM emprunts e
    INNER JOIN lecteurs lec ON e.num_lecteur = lec.num_lecteur
    INNER JOIN livres liv ON e.num_livre = liv.num_livre
    WHERE e.date_retour IS NULL
)
TO 'C:/exports/retards.csv'
WITH (FORMAT CSV, HEADER true, DELIMITER ';');

Plus rapide, et automatisable. Mais attention : le fichier est écrit sur la machine du serveur, pas sur la vôtre. Sur votre poste de laboratoire c'est la même machine, donc cela fonctionne.

4Sauvegarder la base

Une base de données contient souvent des années de travail. Une sauvegarde n'est pas une option.

À retenir

Ce que contient une sauvegarde PostgreSQL : un fichier qui permet de tout reconstruire — les tables, les contraintes, les vues, les index et les données.

C'est bien plus qu'une copie des données : c'est la base entière, transportable sur une autre machine.

Sauvegarder depuis pgAdmin

  1. Clic droit sur la base Sur bibliotheque, puis Backup…
  2. Choisir le fichier Donnez un nom parlant, avec la date : bibliotheque_2026-09-15.backup
  3. Choisir le format Custom pour une sauvegarde compacte à restaurer avec pgAdmin. Plain pour un fichier .sql lisible dans un éditeur de texte.
  4. Lancer Cliquez sur Backup. Un message de confirmation apparaît en bas à droite.
  5. Copier le fichier ailleurs Clé USB, disque externe, espace en ligne. Une sauvegarde sur le même disque que la base ne sert à rien.
FormatFichierQuand l'utiliser
Custom.backup, compresséSauvegarde de routine. Restauration sélective possible.
Plain.sql, du textePour lire, modifier ou transférer vers un autre SGBD.

Restaurer

  1. Créer une base vide Clic droit sur Databases → Create. Ne restaurez pas par-dessus une base existante.
  2. Clic droit sur la nouvelle base Puis Restore…
  3. Choisir le fichier de sauvegarde Et lancer.

En ligne de commande

C'est ce que pgAdmin appelle en coulisse. Utile pour automatiser.

-- Sauvegarder
pg_dump -U postgres -d bibliotheque -F c -f bibliotheque_2026-09-15.backup

-- Restaurer
pg_restore -U postgres -d bibliotheque_copie bibliotheque_2026-09-15.backup

-- Sauvegarder en SQL lisible
pg_dump -U postgres -d bibliotheque -F p -f bibliotheque.sql

Attention

Une sauvegarde jamais testée n'est pas une sauvegarde.

Prenez l'habitude de vérifier : créez une base bibliotheque_test, restaurez-y votre fichier, et regardez si tout est là.

Beaucoup d'organisations découvrent que leurs sauvegardes ne fonctionnent pas le jour où elles en ont besoin. C'est trop tard.

À retenir

La règle des trois copies, appliquée par les professionnels :

Un incendie, un vol ou un dégât des eaux ne fait pas de tri entre le serveur et le disque de sauvegarde posé à côté.

→Exercices

1Créer une vueRecopier
  1. Créez la vue v_emprunts_en_cours de la section 1.
  2. Interrogez-la avec un SELECT *.
  3. Retrouvez-la dans pgAdmin. Où est-elle rangée ?
  4. Ajoutez un nouvel emprunt, puis réinterrogez la vue. Que constatez-vous ?

Solution

INSERT INTO emprunts (date_emprunt, date_prevue, num_lecteur, num_livre)
VALUES (CURRENT_DATE, CURRENT_DATE + 21, 2, 4);

SELECT * FROM v_emprunts_en_cours ORDER BY date_prevue;

3. Sous bibliotheque > Schemas > public > Views, et non sous Tables. Pensez à rafraîchir.

4. Le nouvel emprunt apparaît immédiatement dans la vue, sans qu'on ait rien fait de spécial.

C'est la preuve qu'une vue ne stocke rien : elle rejoue sa requête à chaque appel. Si elle avait été une copie, il aurait fallu la rafraîchir.

Notez aussi : CURRENT_DATE + 21 ajoute 21 jours à la date du jour. C'est exactement la règle des trois semaines de prêt de la bibliothèque.

2Un état de sortie completModifier

La bibliothèque veut un courrier de rappel mensuel.

  1. Écrivez la requête qui liste les emprunts en retard, avec : nom, prénom, adresse, téléphone du lecteur, titre du livre, date prévue, et jours de retard.
  2. Nommez les colonnes en français lisible.
  3. Triez du plus gros retard au plus petit.
  4. Transformez-la en vue nommée v_retards.
  5. Exportez le résultat en CSV et ouvrez-le dans un tableur.

Solution

CREATE OR REPLACE VIEW v_retards AS
SELECT lec.nom                       AS "Nom",
       lec.prenom                    AS "Prénom",
       lec.adresse                   AS "Adresse",
       lec.telephone                 AS "Téléphone",
       liv.titre                     AS "Titre du livre",
       e.date_prevue                 AS "À rendre le",
       CURRENT_DATE - e.date_prevue  AS "Jours de retard"
FROM emprunts e
INNER JOIN lecteurs lec ON e.num_lecteur = lec.num_lecteur
INNER JOIN livres liv   ON e.num_livre   = liv.num_livre
WHERE e.date_retour IS NULL
  AND e.date_prevue < CURRENT_DATE;

SELECT * FROM v_retards ORDER BY "Jours de retard" DESC;

Un détail à connaître : le ORDER BY est placé dans le SELECT final, pas dans la vue.

C'est délibéré. Une vue triée impose son tri à tous ses utilisateurs, et le tri est recalculé même quand personne n'en a besoin. La bonne pratique est de laisser le tri à celui qui interroge.

Sur l'export CSV : pensez au séparateur point-virgule si vous ouvrez dans Excel en configuration belge. Et vérifiez que les accents des en-têtes sortent correctement — sinon, c'est un problème d'encodage : forcez l'UTF-8.

Ce qu'on évalue dans un état de sortie : pas la beauté du tableur, mais que la requête donne exactement ce dont l'utilisateur a besoin. Ici, l'adresse et le téléphone sont là parce qu'on va écrire et téléphoner. Les numéros techniques ont disparu parce que personne n'en a l'usage.

3Sauvegarder et restaurerCréer
  1. Sauvegardez votre base au format Custom, avec la date dans le nom.
  2. Créez une base vide nommée bibliotheque_test.
  3. Restaurez-y votre sauvegarde.
  4. Vérifiez que les tables, les données et les vues sont bien là.
  5. Refaites une sauvegarde au format Plain, et ouvrez le .sql dans un éditeur de texte. Que contient-il ?

Solution

4. La vérification

-- À exécuter sur bibliotheque_test
SELECT COUNT(*) FROM auteurs;
SELECT COUNT(*) FROM livres;
SELECT COUNT(*) FROM emprunts;
SELECT * FROM v_retards;

Les comptages doivent correspondre à l'original, et la vue doit fonctionner. Si la vue manque, c'est que la sauvegarde n'a pas tout pris — vérifiez que vous n'avez pas coché « Data only » dans les options.

5. Ce que contient le fichier .sql

Du SQL lisible, dans cet ordre :

  • des commandes CREATE TABLE, avec toutes vos contraintes ;
  • des commandes COPY ou INSERT avec toutes vos données ;
  • les CREATE INDEX ;
  • les ALTER TABLE … ADD CONSTRAINT pour les clés étrangères ;
  • les CREATE VIEW.

Deux choses à remarquer.

D'abord, les clés étrangères sont ajoutées à la fin, après les données. C'est astucieux : cela évite tous les problèmes d'ordre d'insertion dont nous avons parlé aux fiches 7 et 8.

Ensuite, ce fichier est votre base. Vous pouvez l'ouvrir, le lire, le corriger, l'envoyer par courriel, le déposer sur Classroom. C'est le format à privilégier pour rendre un travail.

Une dernière remarque qui vaut pour toute votre carrière : la sauvegarde que vous venez de tester est la seule qui compte. Celle que vous n'avez jamais restaurée n'est qu'un fichier dont vous espérez qu'il fonctionne.

Je sais faire

Une case qui coince ? Relisez la partie concernée avant de passer à la fiche suivante.

← Fiche 11