Skip to content
Snippets Groups Projects
Commit 2d8153d4 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Bdd de démo et Réorganisation.

parent d383c481
No related branches found
No related tags found
No related merge requests found
Showing
with 7573 additions and 1009 deletions
......@@ -6,16 +6,27 @@
FROM postgres:15
LABEL maintainer="Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>"
#
# Argument spécifiant l'emplacement des ressources Docker à utiliser (valeur par défaut : ressources pour une
# base de données **neuve**).
#
ARG RESOURCE_DIR="docker/dist"
RUN localedef -i fr_FR -c -f UTF-8 -A /usr/share/locale/locale.alias fr_FR.UTF-8
ENV LANG fr_FR.utf8
ENV TZ "Europe/Paris"
ENV PGTZ "Europe/Paris"
# Copie du script de création de la base de données
# (lancé automatiquement ssi le répertoire de persistance de la base de données est vide).
COPY docker/initdb.sh /docker-entrypoint-initdb.d/
# Copie des scripts SQL de création de la base de données (cf. script `initdb.sh`).
# NB : il demeure possible de substituer ces scripts par les vôtres grâce à un montage de volume.
COPY docker/sql/ /sql/
#
# Copie des ressources à utiliser pour créer la base de données :
# - Scripts SQL qui seront lancés par le script `initdb.sh` (ci-après).
# - Script `initdb.sh` lancé automatiquement ssi le répertoire de persistance
# de la base de données est vide.
#
# NB : il est aussi possible de substituer ces ressources par les vôtres grâce à des montages de volumes.
#
COPY ${RESOURCE_DIR}/sql/ /sql/
COPY ${RESOURCE_DIR}/initdb.sh /docker-entrypoint-initdb.d/
......@@ -4,21 +4,40 @@ SyGAL Database Image
Ce projet est une image Docker rassemblant le nécessaire pour créer (le cas échéant) et lancer une base de données
pour l'application ESUP-SyGAL.
--------
Lancement de la base de données
-------------------------------
Pour une bdd **neuve** (dist)
-----------------------------
### Avec `docker-compose`
### Mise à jour (facultative)
Si vous utilisez la commande suivante, le super-utilisateur, le nom de la base de données et de l'utilisateur
SyGAL qui seront créés sont spécifiés "en dur" dans le fichier [`docker-compose.yml`](docker-compose.yml)
(variables d'environnement `POSTGRES_*` et `SYGAL_*`) :
Pour récupérer dans les sources de SyGAL la dernière version des scripts SQL de création d'un bdd **neuve** et les
copier ici, lancer cette commande :
```bash
./docker/update_dist.sh -g https://git.unicaen.fr/open-source/sygal.git
```
N'oubliez pas de mettre à jour le dépôt si névessaire :
```shell
git add . && git commit -m "Mise à jour des scripts de création d'une bdd neuve." && git push
```
### Build de l'image
```bash
docker compose build sygal-db-dist
```
**Attention !** Si vous êtes derrière un proxy, vous pouvez transmettre les valeurs courantes de vos variables d'environement `*_proxy`
à la commande `build` avec des `--build-arg` additionnels.
### Lancement
```bash
docker-compose up
docker compose up sygal-db-dist
```
### Sans `docker-compose`
ou alors
```bash
docker run \
......@@ -29,9 +48,9 @@ docker run \
--env SYGAL_USER=ad_sygal \
--env SYGAL_PASSWORD=azerty \
--publish 5432:5432 \
--volume $PWD/docker/sql/:/sql \
--volume $PWD/data/db:/var/lib/postgresql/data \
sygal-db-image
--volume $PWD/docker/dist/sql/:/sql \
--volume $PWD/docker/dist/db:/var/lib/postgresql/data \
sygal-db-dist
```
Remarques :
......@@ -50,15 +69,15 @@ Remarques :
(exemple : `--volume $PWD/mes/scripts/sql/:/sql`). La présence d'un sous-répertoire `admin` n'est pas obligatoire.
Utilisation de l'image dans un `docker-compose.yml`
---------------------------------------------------
### Utilisation de l'image dans un `docker-compose.yml`
L'image doit avoir été buildée au préalable.
```yml
version: '2.2'
services:
sygal-db:
image: sygal-db
container_name: sygal-db-container
sygal-db-dist:
image: sygal-db-dist
restart: always
environment:
POSTGRES_USER: postgres
......@@ -69,30 +88,71 @@ services:
ports:
- "5432:5432"
volumes:
- ./mon/emplacement/sql/:/sql # répertoire des scripts de création de la bdd
- ./mon/emplacement/db:/var/lib/postgresql/data # répertoire où la bdd est persistée
```
Build de l'image
----------------
--------
Pour une bdd de **démo**
------------------------
- Facultatif : vous pouvez éventuellement récupérer les dernières versions des scripts SQL comme ceci :
### Mise à jour (facultative)
```bash
./update_sql.sh
```
NB : Ce script se termine par un git status permettant de connaître les scripts SQL ayant changé.
```
- Build
### Build
```bash
docker build \
--rm \
-t sygal-db-image \
-t sygal-db-demo \
.
```
**Attention !** Si vous êtes derrière un proxy, vous pouvez transmettre les valeurs courantes de vos variables d'environement `*_proxy`
à la commande `build` avec des `--build-arg` additionnels.
### Lancement
```bash
docker compose up sygal-db-demo
```
ou alors
```bash
docker run \
--rm \
--env POSTGRES_USER=postgres \
--env POSTGRES_PASSWORD=admin \
--env SYGAL_DB=sygal_demo \
--env SYGAL_USER=ad_sygal_demo \
--env SYGAL_PASSWORD=azerty \
--publish 5432:5432 \
--volume $PWD/docker/demo/sql/:/sql \
--volume $PWD/docker/demo/db:/var/lib/postgresql/data \
sygal-db-demo
```
### Utilisation de l'image dans un `docker-compose.yml`
L'image doit avoir été buildée au préalable.
```yml
version: '2.2'
services:
sygal-db-demo:
image: sygal-db-demo
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
SYGAL_DB: sygal_demo
SYGAL_USER: ad_sygal_demo
SYGAL_PASSWORD: azerty
ports:
- "5432:5432"
volumes:
- ./mon/emplacement/db:/var/lib/postgresql/data # répertoire où la bdd est persistée
```
Mise à jour du dump SQL de création d'une bdd de **démo**
=========================================================
Idée
----
L'idée est de lancer le script de génération puis de mise à jour du dump SQL permettant de créer une bdd de
démo à partir d'une bdd modèle à laquelle on doit pouvoir se connecter.
Les étapes de ce script sont les suivantes :
- Dump SQL de la bdd modèle (pg_dump).
- Lancement d'une bdd SyGAL temporaire (à partir de l'image Docker 'sygal-db-image').
- Exécution des scripts SQL de peuplement de la bdd SyGAL temporaire : import du dump puis élagage des données.
- Génération du script SQL d'anonymisation des données de la bdd SyGAL temporaire (ligne de commande de SyGAL).
- Anonymisation de la bdd SyGAL temporaire.
- Dump SQL de la bdd SyGAL anonymisée (pg_dump).
- Copie du dump SQL dans le répertoire cible.
**Attention, l'exécution de ce script peut durer jusqu'à 20 minutes.**
Utilisation
-----------
Le script peut être lancer de n'importe quel emplacement.
Il s'attend à trouver les variables d'environnement permettant de se connecter à la bdd modèle.
Exemple :
```bash
PGHOST=localhost \
PGDATABASE=sygal \
PGPORT=5401 \
PGUSER=ad_sygal \
PGPASSWORD=azerty \
bin/demo/update_demo.sh
```
Un répertoire temporaire de travail sera créé par le script pour y mettre les différents artefacts générés
mais il est possible de spécifier un répertoire existant à utiliser.
Exemple :
```bash
PGHOST=localhost \
PGDATABASE=sygal \
PGPORT=5401 \
PGUSER=ad_sygal \
PGPASSWORD=azerty \
bin/demo/update_demo.sh --tmp /tmp/tmp.iiNxgqBUyK
```
Si le répertoire temporaire est spécifié et que certains artefacts résultant d'un précédent lancement y sont trouvés,
certaines étapes seront sautées :
- Dump SQL de la bdd modèle (pg_dump).
- Exécution des scripts SQL de peuplement de la bdd SyGAL temporaire : import du dump puis élagage des données.
- Génération du script SQL d'anonymisation des données de la bdd SyGAL temporaire (ligne de commande de SyGAL).
<?php
/**
* Fichier de config locale, SANS INFORMATIONS SENSIBLES.
*/
namespace Application;
use Fichier\Command\Pdf\AjoutPdcShellCommandGs;
use Fichier\Command\Pdf\AjoutPdcShellCommandQpdf;
use Laminas\Log\Logger;
return [
'sygal' => [
'page_de_couverture' => [
'template' => [
// template .phtml
'phtml_file_path' => APPLICATION_DIR . '/module/Depot/view/depot/depot/page-de-couverture/pagedecouverture.phtml',
// feuille de styles
'css_file_path' => APPLICATION_DIR . '/module/Depot/view/depot/depot/page-de-couverture/pagedecouverture.css',
],
],
'archivabilite' => [
'proxy' => [
'enabled' => true,
'proxy_host' => 'http://proxy.unicaen.fr',
'proxy_port' => 3128,
],
],
'depot_version_corrigee' => [
'resaisir_autorisation_diffusion' => false,
'resaisir_attestations' => false,
],
'rapport' => [
'page_de_couverture' => [
'template' => [
// template .phtml
'phtml_file_path' => APPLICATION_DIR . '/module/Application/view/application/rapport/page-de-couverture/pagedecouverture.phtml',
// feuille de styles
'css_file_path' => APPLICATION_DIR . '/module/Application/view/application/rapport/page-de-couverture/pagedecouverture.css',
],
],
],
],
'actualite' => [
'actif' => false,
'flux' => "https://www.normandie-univ.fr/feed/?post_type=post&cat=406,448,472",
],
'offre-these' => [
'actif' => true,
],
'import-api' => [
// cf. secret.local.php
],
'import' => [
// cf. secret.local.php
],
'psr_log' => [
'inscription_resource_logger' => [
'writers' => [
'stream' => [
'name' => 'stream',
'priority' => 1,
'options' => [
'stream' => '/var/log/sygal.inscription_resource_logger.log',
'filters' => Logger::DEBUG,
],
],
],
],
],
'doctrine' => [
// cf. secret.local.php
],
'cli_config' => [
// cf. secret.local.php
],
'public_files' => [
'cache_enabled' => false,
],
'unicaen-shell' => [
'commands' => [
AjoutPdcShellCommandGs::class => [
'executable' => '/usr/bin/gs',
],
AjoutPdcShellCommandQpdf::class => [
'executable' => '/usr/bin/qpdf',
],
],
],
'unicaen-app' => [
'app_infos' => [
'mentionsLegales' => "http://www.unicaen.fr/acces-direct/mentions-legales/",
'informatiqueEtLibertes' => "http://www.unicaen.fr/acces-direct/informatique-et-libertes/",
],
'mail' => [
// cf. secret.local.php
'do_not_send' => false,
],
'ldap' => [
// cf. secret.local.php
],
'maintenance' => [
// cf. z.maintenance.local.php
],
],
'unicaen-ldap' => [
// pas de LDAP
],
'unicaen-auth' => [
'shib' => [
'order' => 1,
'enabled' => true,
'description' =>
"<p><span class='glyphicon glyphicon-info-sign'></span> Cliquez sur le bouton ci-dessous pour accéder à l'authentification via la fédération d'identité.</p>" .
"<p><strong>Attention !</strong> Si vous possédez à la fois un compte Étudiant et un compte Personnel, vous devrez utiliser " .
"votre compte <em>Étudiant</em> pour vous authentifier...</p>",
'simulate' => [
// cf. secret.local.php
],
'aliases' => [
// cf. secret.local.php
],
'required_attributes' => [
// cf. secret.local.php
],
'logout_url' => '/Shibboleth.sso/Logout?return=', // NB: '?return=' semble obligatoire!
/**
* Configuration de la stratégie d'extraction (parmi les données d'authentification shibboleth)
* de l'identifiant à utiliser pour rechercher l'Individu correspondant à l'utilisateur qui vient de
* s'authentifier.
*/
'shib_user_id_extractor' => [
'default' => [
['name' => 'supannEtuId'],
['name' => 'supannEmpId'],
],
],
],
'local' => [
'order' => 2,
'description' => "Utilisez ce formulaire si vous possédez un compte LDAP établissement ou un compte local dédié à l'application.",
'ldap' => [
'enabled' => true,
'log_failures' => true, // activation ou non des logs (via error_log par défaut) à propos des échecs d'authentification LDAP.
],
'db' => [
'enabled' => true, // doit être activé pour que l'usurpation fonctionne (cf. Authentication/Storage/Db::read()) :-/ todo: faire mieux
],
],
'cas' => [
'order' => 3,
'enabled' => false,
'connection' => [
// pas de CAS
]
],
'usurpation_allowed_usernames' => [
// cf. secret.local.php
],
],
'navigation' => [
'default' => [
'home' => [
'pages' => [
'etab' => [
'label' => _("Normandie Université"),
'title' => _("Page d'accueil du site de Normandie Université"),
'uri' => 'http://www.normandie-univ.fr',
'class' => 'logo-etablissement',
// NB: Spécifier la classe 'logo-etablissement' sur la page de navigation provoque le "remplacement"
// du label du lien par l'image 'public/logo-etablissement.png' (à créer).
],
],
],
],
],
];
<?php
/**
* Fichier de config locale, AVEC INFORMATIONS SENSIBLES.
*/
namespace Application;
use Laminas\Mail\Transport\Smtp;
return [
'import' => [
'connections' => [],
'imports' => [],
'synchros' => [],
],
'doctrine' => [
'connection' => [
'orm_default' => [
'params' => [
'host' => '{DB_HOST}', //
'port' => '{DB_PORT}', //
'dbname' => '{DB_NAME}', // remplacés par le script sh
'user' => '{DB_USER}', //
'password' => '{DB_PASSWORD}', //
],
],
],
],
'cli_config' => [
'scheme' => 'https',
'domain' => 'localhost:8443',
],
'unicaen-app' => [
'mail' => [
'transport' => Smtp::class,
'transport_options' => [
'host' => 'smtp.domain.fr',
'port' => 25,
],
'from' => 'ne_pas_repondre@etablissement-demo.fr',
'redirect_to' => ['e.mail@etablissement-demo.fr'],
],
/**
* Paramètres de fonctionnement LDAP.
*/
'ldap' => [
'connection' => [
'default' => [
'params' => [
// pas de LDAP
]
]
]
],
/**
* Paramétrage pour utilisation pour autorisation ou non à la connexion à
* une app de l'exterieur de l'établissement.
*/
'hostlocalization' => [
'activated' => false,
'proxies' => [
//xxx.xx.xx.xxx
],
'reverse-proxies' => [
//xxx.xx.xx.xxx
],
'masque-ip' => '',
],
],
'unicaen-auth' => [
'shib' => [],
'usurpation_allowed_usernames' => [],
],
'liste-diffusion' => [
'email_domain' => 'liste.etablissement-demo.fr',
'sympa' => [
'url' => 'https://liste.etablissement-demo.fr',
],
'proprietaires' => [
'e.mail@etablissement-demo.fr' => "HOCHON Paule",
],
],
];
<?php
namespace Application;
use Admission\Entity\Db\ConventionFormationDoctorale;
use Admission\Entity\Db\Etudiant;
use Application\Entity\Db\RapportAvis;
use Application\Entity\Db\Variable;
use ComiteSuiviIndividuel\Entity\Db\Membre;
use Depot\Entity\Db\Diffusion;
use Depot\Entity\Db\MetadonneeThese;
use Depot\Entity\Db\RdvBu;
use Fichier\Entity\Db\Fichier;
use Formation\Entity\Db\EnqueteReponse;
use Formation\Entity\Db\Inscription;
use Formation\Entity\Db\Seance;
use Individu\Entity\Db\Individu;
use Application\Entity\Db\MailConfirmation;
use Individu\Entity\Db\IndividuCompl;
use RapportActivite\Entity\Db\RapportActivite;
use Soutenance\Entity\Adresse;
use Soutenance\Entity\Avis;
use Soutenance\Entity\Proposition;
use These\Entity\Db\These;
use Application\Entity\Db\Utilisateur;
use Doctorant\Entity\Db\Doctorant;
use UnicaenAvis\Entity\Db\AvisComplem;
use UnicaenDbImport\Entity\Db\ImportLog;
return [
'unicaen-db-anonym' => [
'output' => [
'anonymisation' => '/tmp/demo.unicaen_db_anonym_anonymisation.sql',
'restauration' => '/tmp/demo.unicaen_db_anonym_restauration.sql', // pas utilisé pour générer la bddd de démo
],
'entities' => [
ConventionFormationDoctorale::class => [
'mapping' => [
'calendrier_projet_recherche' => 'paragraph',
'modalites_encadr_suivi_avancmt_rech' => 'paragraph',
'conditions_realisation_proj_rech' => 'paragraph',
'modalites_integration_ur' => 'paragraph',
'partenariats_proj_these' => 'paragraph',
'motivation_demande_confidentialite' => 'paragraph',
'projet_pro_doctorant' => 'paragraph',
],
],
Etudiant::class => [
'mapping' => [
'sexe' => 'title',
'nom_usuel' => 'lastName',
'nom_famille' => 'lastName',
'prenom' => 'firstName',
'prenom2' => 'null',
'prenom3' => 'null',
'ine' => ['randomNumber', 6, true],
'courriel' => 'safeEmail',
'adresse_ligne1_etage' => 'streetAddress',
'adresse_ligne2_batiment' => 'secondaryAddress',
'adresse_ligne3_voie' => 'null',
'adresse_ligne4_complement' => 'null',
'adresse_code_postal' => ['randomNumber', 5, true],
'adresse_nom_commune' => 'null',
'adresse_code_commune' => 'null',
'code_commune_naissance' => 'null',
'libelle_commune_naissance' => 'null',
'adresse_cp_ville_etrangere' => 'null',
'numero_telephone1' => 'null',
'numero_telephone2' => 'null',
],
],
\Admission\Entity\Db\Inscription::class => [
'mapping' => [
'prenom_directeur_these' => 'firstName',
'nom_directeur_these' => 'lastName',
'mail_directeur_these' => 'safeEmail',
'prenom_codirecteur_these' => 'firstName',
'nom_codirecteur_these' => 'lastName',
'mail_codirecteur_these' => 'safeEmail',
'titre_these' => 'sentence',
],
],
Membre::class => [
'mapping' => [
'email' => 'safeEmail',
'nom' => 'lastName',
'prenom' => 'firstName',
]
],
Diffusion::class => [
'mapping' => [
'autoris_motif' => 'sentence',
'orcid' => 'md5',
'nnt' => ['name' => 'isbn13'], // varchar(30) !
'hal_id' => 'md5',
]
],
Doctorant::class => [
'mapping' => [
'source_code' => ['name' => 'md5', 'unique' => true], // todo : faut-il préserver le prefixe étab ?
'ine' => 'md5',
'npd_force' => 'md5',
],
'except' => [
//'source' => [2, 4, 5],
],
],
Fichier::class => [
'mapping' => [
'nom' => 'word',
'nomOriginal' => 'word',
],
],
EnqueteReponse::class => [
'mapping' => [
'description' => 'sentence',
],
],
Inscription::class => [
'mapping' => [
'description' => 'sentence',
],
],
Seance::class => [
'mapping' => [
'lieu' => 'address',
],
],
Individu::class => [
'mapping' => [
'source_code' => ['name' => 'md5', 'unique' => true], // todo : faut-il préserver le prefixe étab ?
'nomUsuel' => 'lastName',
'nomPatronymique' => 'lastName',
'prenom1' => 'firstName',
'email' => 'safeEmail',
'supann_id' => 'isbn13', // varchar(30) !
'id_ref' => 'md5',
'npd_force' => 'md5',
],
'except' => [
'id' => [
4974, // Bertrand
],
],
],
IndividuCompl::class => [
'mapping' => [
'email' => 'safeEmail',
],
],
MailConfirmation::class => [
'mapping' => [
'email' => 'safeEmail',
],
],
MetadonneeThese::class => [
'mapping' => [
'titre' => 'sentence',
'titre_autre_langue' => 'sentence',
'resume' => 'paragraph',
'resume_anglais' => 'paragraph',
'mots_cles_libres_fr' => ['words', 4, true],
'mots_cles_libres_ang' => ['words', 4, true],
],
],
RapportActivite::class => [
'mapping' => [
'productions_scientifiques' => 'paragraph',
'par_directeur_these_motif' => 'sentence',
'principaux_resultats_obtenus' => 'paragraph',
'description_projet_recherche' => 'paragraph',
'actions_diffusion_culture_scientifique' => 'paragraph',
'autres_activites' => 'paragraph',
'calendrier_previonnel_finalisation' => 'paragraph',
'preparation_apres_these' => 'paragraph',
'perspectives_apres_these' => 'paragraph',
'commentaires' => 'sentence',
],
],
RdvBu::class => [
'mapping' => [
'coord_doctorant' => 'sentence',
'dispo_doctorant' => ['randomElement', ["Le soir", "Le matin"]],
'mots_cles_rameau' => ['words', 4, true],
'divers' => 'sentence',
],
],
Adresse::class => [
'mapping' => [
'ligne1' => 'secondaryAddress',
'ligne2' => 'streetAddress',
'ligne3' => 'null',
],
],
Avis::class => [
'mapping' => [
'motif' => 'sentence',
],
],
\Soutenance\Entity\Membre::class => [
'mapping' => [
'email' => 'safeEmail',
'nom' => 'lastName',
'prenom' => 'firstName',
'adresse' => 'address',
],
],
Proposition::class => [
'mapping' => [
'lieu' => 'address',
'nouveau_titre' => 'sentence',
'adresse_exacte' => 'address',
],
],
These::class => [
'mapping' => [
'titre' => 'sentence',
],
],
AvisComplem::class => [
'mapping' => [
'valeur' => 'sentence',
],
],
Utilisateur::class => [
'mapping' => [
'username' => ['name' => 'userName', 'unique' => true],
'email' => 'safeEmail',
'displayName' => 'name',
'nom' => 'lastName',
'prenom' => 'firstName',
],
'except' => [
'username' => [
'gauthierb@unicaen.fr',
],
],
],
Variable::class => [
'mapping' => [
'valeur' => 'safeEmail',
],
'except' => [
'code' => [
'ETB_ART_ETB_LIB',
'ETB_LIB',
'ETB_LIB_NOM_RESP',
'ETB_LIB_TIT_RESP',
'TRIBUNAL_COMPETENT',
],
],
],
],
'tables' => [
'substit_individu' => [
'mapping' => [
'npd' => 'word',
]
],
'substit_doctorant' => [
'mapping' => [
'npd' => 'word',
]
],
],
],
];
#!/bin/bash
set -o nounset
#set -o xtrace
THIS_DIR=$(cd $(dirname $0) && pwd)
ROOT_DIR=${THIS_DIR}
###############################################################################################################
#
# Le but de ce script est de mettre à jour les scripts SQL présents dans cette image ; scripts permettant
# de créer/initialiser une base de données vierge pour l'application SyGAL.
#
# Il récupère dans les sources de l'application SyGAL (à partir d'un dépôt git ou d'un répertoire local)
# les scripts et ressources permettant de générer les scripts SQL en question.
#
###############################################################################################################
TARGET_DIR=$(realpath "${ROOT_DIR}/../../docker/demo")
SYGAL_BRANCH="release_8.4.0"
SYGAL_DB="sygal"
SYGAL_USER="ad_sygal"
SYGAL_PASSWORD="azerty"
usage() {
echo "Usage :"
echo " $(basename $0) ARGUMENTS"
echo "Arguments :"
echo "-t|--tmp <DIR> Répertoire temporaire à (ré)utiliser. Facultatif."
exit 0
}
#if [ ${#} -eq 0]]; then
# usage
#fi
TMP_DIR=$(mktemp -d)
DOCKER_CLI_HINTS=false
DB_CONTAINER_NAME="sygal_db_$RANDOM"
NETWORK_NAME="sygal_network_$RANDOM"
ARGS=`getopt -o "g:l:" -l "t:,x:,tmp:,xxx:" -n "getopt.sh" -- "$@"`
[[ $? -ne 0 ]] && exit 1
eval set -- "$ARGS"
while true;
do
case "$1" in
-t|--tmp)
[[ -n "$2" ]] && TMP_DIR="$2"
shift 2;;
# -x|--xxx)
# [[ -n "$2" ]] && DUMP_DIR="$2"
# shift 2;;
--)
shift
break;;
?)
echo "Option invalide : -${OPTARG}."
usage;;
esac
done
teardown() {
docker stop $DB_CONTAINER_NAME >/dev/null 2>&1
docker rm $DB_CONTAINER_NAME >/dev/null 2>&1
docker network rm $NETWORK_NAME >/dev/null 2>&1
return 0
}
trap 'teardown; exit 1' EXIT HUP INT TERM
trap 'teardown' EXIT
echo "=================================================================================="
echo " Génération des scripts SQL de création d'une bdd de démo "
echo "=================================================================================="
[[ ! -d $TMP_DIR ]] && echo "Le répertoire $TMP_DIR doit exister au préalable" && exit 1
[[ -z $PGHOST ]] && echo "Vous devez fournir la variable PGHOST." && exit 1
[[ -z $PGPORT ]] && echo "Vous devez fournir la variable PGPORT." && exit 1
[[ -z $PGDATABASE ]] && echo "Vous devez fournir la variable PGDATABASE." && exit 1
[[ -z $PGUSER ]] && echo "Vous devez fournir la variable PGUSER." && exit 1
[[ -z $PGPASSWORD ]] && echo "Entrez la valeur de PGPASSWORD, svp. " && read -s PGPASSWORD && export PGPASSWORD
echo "# Répertoire temporaire : $TMP_DIR"
echo "--------------------------------------------------------------------------------------------------------"
SQL_OUTPUT_DIR="$TMP_DIR/sql"
mkdir -p $SQL_OUTPUT_DIR
#
# Dump de la bdd modèle.
#
SQL_DUMP_FILE_NAME="02_dump.sql"
SQL_DUMP_FILE_PATH="$SQL_OUTPUT_DIR/$SQL_DUMP_FILE_NAME"
echo "# Dump SQL de la bdd modèle $PGUSER/$PGDATABASE@$PGHOST:$PGPORT... "
if [ ! -f "$SQL_DUMP_FILE_PATH" ]; then
docker run \
--env PGHOST \
--env PGPORT \
--env PGDATABASE \
--env PGUSER \
--env PGPASSWORD \
--net host \
postgres:15 \
pg_dump \
--exclude-table z_* \
--exclude-table sav_* \
--exclude-table *_sav \
--exclude-table-data notif_mail \
--exclude-table-data liste_diff \
--exclude-table-data unicaen_renderer_rendu \
--exclude-table-data user_token \
--exclude-table-data tmp_* \
--exclude-table-data *_log \
--no-owner \
> "$SQL_DUMP_FILE_PATH"
[[ $? -ne 0 ]] && exit 1
echo "Fait : $SQL_DUMP_FILE_PATH"
else
echo "Inutile, un fichier $SQL_DUMP_FILE_PATH existe déjà."
fi
unset POSTGRES_PASSWORD PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD
echo "--------------------------------------------------------------------------------------------------------"
#
# Lancement d'une bdd temporaire minimale.
#
echo "# Lancement en arrière-plan d'une bdd temporaire $SYGAL_USER/$SYGAL_DB... "
GIT_DIR="$TMP_DIR/docker/sygal-db-image"
if [ ! -d "$GIT_DIR" ]; then
mkdir -p "$TMP_DIR/docker" && cd "$TMP_DIR/docker" && \
git clone git@git.unicaen.fr:open-source/docker/sygal-db-image && \
cd $GIT_DIR && \
git fetch && git checkout master && git pull
[[ $? -ne 0 ]] && exit 1
fi
cd $GIT_DIR && \
rm -f ./docker/sql/*.sql && \
docker network create -d bridge $NETWORK_NAME && \
docker build -t sygal-db-image . && \
docker run \
-d \
--env POSTGRES_PASSWORD=admin \
--env SYGAL_DB=$SYGAL_DB \
--env SYGAL_USER=$SYGAL_USER \
--env SYGAL_PASSWORD=$SYGAL_PASSWORD \
--publish "55432:5432" \
--volume $SQL_OUTPUT_DIR:/tmp/sql \
--volume $TMP_DIR/docker/db:/var/lib/postgresql/data \
--network $NETWORK_NAME \
--name $DB_CONTAINER_NAME \
sygal-db-image
[[ $? -ne 0 ]] && exit 1
echo "En cours dans le container '$DB_CONTAINER_NAME'"
echo "Attente que la bdd temporaire soit prête..."
timeout 30s bash -c "until docker exec $DB_CONTAINER_NAME pg_isready --host=localhost ; do sleep 5 ; done"
[[ $? -ne 0 ]] && docker container logs $DB_CONTAINER_NAME && echo 'Trop long, abandon !' && exit 1
echo "--------------------------------------------------------------------------------------------------------"
SQL_PREPARE_FILE_NAME="03_prepare.sql"
#
# Exécution des scripts de peuplement de la bdd temporaire, si aucune donnée déjà persistée.
#
echo "# Exécution des scripts de peuplement de la bdd temporaire $SYGAL_USER/$SYGAL_DB..."
if [ ! -d "$TMP_DIR/docker/db" ]; then
cp -f $ROOT_DIR/src/db/tmp/*.sql "$SQL_OUTPUT_DIR/" && \
echo " - Lancement de $SQL_DUMP_FILE_NAME..." && \
docker exec \
--env PGDATABASE=$SYGAL_DB \
--env PGUSER=$SYGAL_USER \
$DB_CONTAINER_NAME \
psql -o /dev/null --quiet -v ON_ERROR_STOP=1 -f /tmp/sql/$SQL_DUMP_FILE_NAME && \
echo " - Lancement de $SQL_PREPARE_FILE_NAME..." && \
docker exec \
--env PGDATABASE=$SYGAL_DB \
--env PGUSER=$SYGAL_USER \
$DB_CONTAINER_NAME \
psql -o /dev/null --quiet -v ON_ERROR_STOP=1 -f /tmp/sql/$SQL_PREPARE_FILE_NAME && \
echo "Fait."
[[ $? -ne 0 ]] && exit 1
else
echo "Inutile, des données persistées existent déjà dans $TMP_DIR/docker/db."
fi
echo "--------------------------------------------------------------------------------------------------------"
#
# Build et run SyGAL pour générer le script d'anonymisation.
#
SQL_OUTPUT_FILE_NAME="09_anonymisation.sql"
SQL_OUTPUT_FILE_PATH="$SQL_OUTPUT_DIR/$SQL_OUTPUT_FILE_NAME"
echo "# Génération du script d'anonymisation des données de la bdd temporaire $SYGAL_USER/$SYGAL_DB... "
if [ ! -f "$SQL_OUTPUT_FILE_PATH" ]; then
GIT_DIR="$TMP_DIR/docker/sygal"
if [ ! -d "$GIT_DIR" ]; then
mkdir -p "$TMP_DIR/docker" && cd "$TMP_DIR/docker" && \
git clone git@git.unicaen.fr:open-source/sygal
fi
[[ $? -ne 0 ]] && exit 1
cd $GIT_DIR && git checkout $SYGAL_BRANCH && git pull && \
docker build --build-arg PHP_VERSION=8.0 -t sygal-image-tmp . && \
echo "Attente que la bdd temporaire soit prête..." && \
timeout 120s bash -c "until docker exec $DB_CONTAINER_NAME pg_isready --host=localhost ; do sleep 5 ; done"
[[ $? -ne 0 ]] && docker container logs $DB_CONTAINER_NAME && exit 1
cp -r $ROOT_DIR/src/app/config/autoload/zzz.local.php $TMP_DIR/ && \
cp -r $ROOT_DIR/src/app/config/autoload/zzz.secret.local.php $TMP_DIR/ && \
cp -r $ROOT_DIR/src/app/config/autoload/zzz.unicaen-db-anonym.local.php $TMP_DIR/ && \
sed -i "s|{DB_HOST}|$DB_CONTAINER_NAME|g
s|{DB_PORT}|5432|g
s|{DB_NAME}|$SYGAL_DB|g
s|{DB_USER}|$SYGAL_USER|g
s|{DB_PASSWORD}|$SYGAL_PASSWORD|g" $TMP_DIR/zzz.secret.local.php && \
docker run \
--rm \
-v $TMP_DIR/zzz.local.php:/app/config/autoload/zzz.local.php:ro \
-v $TMP_DIR/zzz.secret.local.php:/app/config/autoload/zzz.secret.local.php:ro \
-v $TMP_DIR/zzz.unicaen-db-anonym.local.php:/app/config/autoload/zzz.unicaen-db-anonym.local.php:ro \
-v $HOME/.cache/composer:/root/.cache/composer \
-v $HOME/.config/composer:/root/.config/composer \
-v /tmp:/tmp \
-w /app \
--network $NETWORK_NAME \
sygal-image-tmp \
bash -c "rm -f /tmp/demo.unicaen_db_anonym_*.sql && php public/index.php unicaen-db-anonym generer" && \
cp -f /tmp/demo.unicaen_db_anonym_anonymisation.sql $SQL_OUTPUT_FILE_PATH && \
echo "Fait." &&
echo "> $SQL_OUTPUT_FILE_PATH"
[[ $? -ne 0 ]] && exit 1
else
echo "Inutile, un fichier $SQL_OUTPUT_FILE_PATH existe déjà."
fi
echo "--------------------------------------------------------------------------------------------------------"
#
# Exécution du script d'anonymisation.
#
echo "# Exécution du script d'anonymisation sur la bdd temporaire $SYGAL_USER/$SYGAL_DB... "
docker exec \
--env PGDATABASE=$SYGAL_DB \
--env PGUSER=$SYGAL_USER \
$DB_CONTAINER_NAME \
psql --quiet -v ON_ERROR_STOP=1 -f "/tmp/sql/$SQL_OUTPUT_FILE_NAME" && \
echo "Fait."
[[ $? -ne 0 ]] && exit 1
echo "--------------------------------------------------------------------------------------------------------"
#
# Dump SQL de la bdd anonymisée.
#
SQL_OUTPUT_DIR="$TMP_DIR/sql"
SQL_DUMP_FILE_PATH="$SQL_OUTPUT_DIR/02_dump.sql"
mkdir -p $SQL_OUTPUT_DIR
echo "# Dump SQL de la bdd anonymisée... "
docker exec \
--env PGDATABASE=$SYGAL_DB \
--env PGUSER=$SYGAL_USER \
$DB_CONTAINER_NAME \
pg_dump --no-owner > $SQL_DUMP_FILE_PATH && \
echo "Fait." && \
ls -lh $SQL_DUMP_FILE_PATH
[[ $? -ne 0 ]] && exit
echo "--------------------------------------------------------------------------------------------------------"
echo "# Copie du dump SQL dans le répertoire $TARGET_DIR/sql/ :"
cp -v --backup --suffix="~" $SQL_DUMP_FILE_PATH "$TARGET_DIR/sql/"
echo "--------------------------------------------------------------------------------------------------------"
echo "TERMINÉ"
#!/bin/bash
set -o nounset
set -e
THIS_DIR=$(cd $(dirname $0) && pwd)
ROOT_DIR=${THIS_DIR}
###############################################################################################################
#
# Le but de ce script est de mettre à jour les scripts SQL présents dans cette image ; scripts permettant
# de créer/initialiser une base de données vierge pour l'application SyGAL.
#
# Il récupère dans les sources de l'application SyGAL (à partir d'un dépôt git ou d'un répertoire local)
# les scripts et ressources permettant de générer les scripts SQL en question.
#
###############################################################################################################
TARGET_DIR=$(realpath "${ROOT_DIR}/../../docker/dist")
usage() {
echo "Usage :"
echo " $(basename $0) ARGUMENTS"
echo "Arguments :"
echo "-g|--git GIT_REPO
Adresse du dépôt git de SyGAL.
Facultatif si -l est utilisé.
Ex : git@git.unicaen.fr:/open-source/sygal"
echo "-l|--local LOCAL_DIR
Chemin local des sources de SyGAL, en remplacement du dépôt git.
Facultatif si -g est utilisé."
exit 0
}
if [[ ${#} -eq 0 ]]; then
usage
fi
ARGS=`getopt -o "g:l:" -l "git:,local:" -n "getopt.sh" -- "$@"`
[[ $? -ne 0 ]] && exit 1
eval set -- "$ARGS"
while true;
do
case "$1" in
-g|--git)
[[ -n "$2" ]] && GIT_REPO="$2"
shift 2;;
-l|--local)
[[ -n "$2" ]] && LOCAL_DIR="$2"
shift 2;;
--)
shift
break;;
?)
echo "Option invalide : -${OPTARG}."
usage;;
esac
done
TMP_DIR=$(mktemp -d)
BRANCH=master
[[ ! -d $TMP_DIR ]] && echo "Le répertoire $TMP_DIR doit être créé au préalable" && exit 1
[[ ! -z "$(ls -A $TMP_DIR)" ]] && echo "Le répertoire $TMP_DIR doit être vide" && exit 1
[[ -n ${LOCAL_DIR} ]] && [[ ! -d $LOCAL_DIR ]] && echo "Le répertoire $LOCAL_DIR n'existe pas" && exit 1
if [[ -n ${GIT_REPO} ]]; then
echo
echo "----- Obtention des dernières versions des scripts de création de bdd via ${GIT_REPO} ----"
git clone ${GIT_REPO} ${TMP_DIR}
cd ${TMP_DIR}
git checkout ${BRANCH}
git pull
elif [[ -n ${LOCAL_DIR} ]]; then
echo
echo "----- Copie des scripts de création de bdd à partir du répertoire local ${LOCAL_DIR} ----"
mkdir -p ${TMP_DIR}/doc/database
cp -rv ${LOCAL_DIR}/doc/database/* ${TMP_DIR}/doc/database/
fi
echo
echo "----- Préparation des scripts SQL ---------------------------------------------------------------"
cd ${TMP_DIR}/doc/database
mv build_db_files.conf.dist build_db_files.conf
bash build_db_files.sh -c ./build_db_files.conf -i ./sql/
rm ./sql/*.dist
echo
echo "----- Mise à jour des scripts SQL dans l'image-------------------------------------------------"
rm -r ${TARGET_DIR}/sql/*
cp -rv ./sql/* ${TARGET_DIR}/sql/
echo
echo "Terminé."
echo "Faites un git status pour voir les changements !"
cd ${ROOT_DIR}
version: '3.1'
services:
sygal-db:
image: sygal-db
restart: always
dist:
build:
context: .
environment:
#POSTGRES_DB: postgres
RESOURCE_DIR: "docker/dist"
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
SYGAL_DB: sygal
SYGAL_USER: ad_sygal
SYGAL_PASSWORD: azerty
ports:
- "5532:5432"
volumes:
- /tmp/sygal-db/dist/db:/var/lib/postgresql/data # répertoire où la bdd est persistée
demo:
build:
context: .
environment:
RESOURCE_DIR: "docker/demo"
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
SYGAL_DB: sygal_demo
SYGAL_USER: ad_sygal_demo
SYGAL_PASSWORD: azerty
ports:
- "5432:5432"
volumes:
#- ./docker/db/sql/:/sql # répertoire des scripts de création de la bdd
- ./data/db:/var/lib/postgresql/data # répertoire où la bdd est persistée
- /tmp/sygal-db/demo/db:/var/lib/postgresql/data # répertoire où la bdd est persistée
README
======
Ressources Docker pour une base de données de **démo**.
#!/bin/bash
set -e
SQL_DIR="/sql"
##
## Lancement des scripts SQL présents dans le répertoire `/sql`.
##
echo "-------------------------------------------------------------------------------------------------------"
echo " $0"
echo "-------------------------------------------------------------------------------------------------------"
unset PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD # précaution
[[ -z $POSTGRES_DB ]] && echo "Variable d'environnement POSTGRES_DB absente." && exit 1
[[ -z $POSTGRES_USER ]] && echo "Variable d'environnement POSTGRES_USER absente." && exit 1
[[ -z $POSTGRES_PASSWORD ]] && echo "Variable d'environnement POSTGRES_PASSWORD absente." && exit 1
[[ -z $SYGAL_DB ]] && echo "Variable d'environnement SYGAL_DB absente." && exit 1
[[ -z $SYGAL_USER ]] && echo "Variable d'environnement SYGAL_USER absente." && exit 1
[[ -z $SYGAL_PASSWORD ]] && echo "Variable d'environnement SYGAL_PASSWORD absente." && exit 1
echo "POSTGRES_DB = $POSTGRES_DB"
echo "POSTGRES_USER = $POSTGRES_USER"
echo "POSTGRES_PASSWORD = $POSTGRES_PASSWORD"
echo "SYGAL_DB = $SYGAL_DB"
echo "SYGAL_USER = $SYGAL_USER"
echo "SYGAL_PASSWORD = $SYGAL_PASSWORD"
#
# Exécution EN TANT QUE SUPER-USER de tous les scripts .sql présents dans le répertoire `/sql/admin`.
# NB : il est possible de substituer ces scripts par les vôtres grâce à un volume à monter dans `/sql/admin`.
#
if [ -d "${SQL_DIR}/admin" ]; then
cd ${SQL_DIR}/admin
export \
PGDATABASE=${POSTGRES_DB} \
PGUSER=${POSTGRES_USER} \
PGPASSWORD=${POSTGRES_PASSWORD}
for f in *.sql; do
[[ ! -f "$f" ]] && continue
echo "--------------------------------------- $f ----------------------------------------"
psql \
-v ON_ERROR_STOP=1 \
-v dbname=${SYGAL_DB} \
-v dbuser=${SYGAL_USER} \
-v dbpassword="'${SYGAL_PASSWORD}'" \
-f $f
[[ $? -ne 0 ]] && exit 1
done
fi
echo
#
# Exécution de tous les scripts .sql présents dans le répertoire `/sql`.
# NB : il est possible de substituer ces scripts par les vôtres grâce à un volume à monter dans `/sql`.
#
cd ${SQL_DIR}
export \
PGDATABASE=${SYGAL_DB} \
PGUSER=${SYGAL_USER} \
PGPASSWORD="'${SYGAL_PASSWORD}'"
for f in *.sql; do
[[ ! -f "$f" ]] && continue
echo "--------------------------------------- $f ----------------------------------------"
psql \
-v ON_ERROR_STOP=1 \
-v dbuser=${SYGAL_USER} \
-f $f
[[ $? -ne 0 ]] && exit 1
done
unset PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD # précaution
README
======
Ressources Docker pour une base de données **neuve** (dist).
#!/bin/bash
set -e
SQL_DIR="/sql"
##
## Lancement des scripts SQL présents dans le répertoire `/sql`.
##
echo "-------------------------------------------------------------------------------------------------------"
echo " $0"
echo "-------------------------------------------------------------------------------------------------------"
unset PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD # précaution
[[ -z $POSTGRES_DB ]] && echo "Variable d'environnement POSTGRES_DB absente." && exit 1
[[ -z $POSTGRES_USER ]] && echo "Variable d'environnement POSTGRES_USER absente." && exit 1
[[ -z $POSTGRES_PASSWORD ]] && echo "Variable d'environnement POSTGRES_PASSWORD absente." && exit 1
[[ -z $SYGAL_DB ]] && echo "Variable d'environnement SYGAL_DB absente." && exit 1
[[ -z $SYGAL_USER ]] && echo "Variable d'environnement SYGAL_USER absente." && exit 1
[[ -z $SYGAL_PASSWORD ]] && echo "Variable d'environnement SYGAL_PASSWORD absente." && exit 1
echo "POSTGRES_DB = $POSTGRES_DB"
echo "POSTGRES_USER = $POSTGRES_USER"
echo "POSTGRES_PASSWORD = $POSTGRES_PASSWORD"
echo "SYGAL_DB = $SYGAL_DB"
echo "SYGAL_USER = $SYGAL_USER"
echo "SYGAL_PASSWORD = $SYGAL_PASSWORD"
#
# Exécution EN TANT QUE SUPER-USER de tous les scripts .sql présents dans le répertoire `/sql/01_admin`.
# NB : il est possible de substituer ces scripts par les vôtres grâce à un volume à monter dans `/sql/01_admin`.
#
if [ -d "${SQL_DIR}/01_admin" ]; then
cd "${SQL_DIR}/01_admin"
export \
PGDATABASE=${POSTGRES_DB} \
PGUSER=${POSTGRES_USER} \
PGPASSWORD=${POSTGRES_PASSWORD}
for f in *.sql; do
[[ ! -f "$f" ]] && continue
echo "--------------------------------------- $f ----------------------------------------"
psql \
-v ON_ERROR_STOP=1 \
-v dbname=${SYGAL_DB} \
-v dbuser=${SYGAL_USER} \
-v dbpassword="'${SYGAL_PASSWORD}'" \
-f $f
[[ $? -ne 0 ]] && exit 1
done
fi
echo
#
# Exécution de tous les scripts .sql présents dans le répertoire `/sql/02_other`.
# NB : il est possible de substituer ces scripts par les vôtres grâce à un volume à monter dans `/sql/02_other`.
#
if [ -d "${SQL_DIR}/02_other" ]; then
cd "${SQL_DIR}/02_other"
export \
PGDATABASE=${SYGAL_DB} \
PGUSER=${SYGAL_USER} \
PGPASSWORD="'${SYGAL_PASSWORD}'"
for f in *.sql; do
[[ ! -f "$f" ]] && continue
echo "--------------------------------------- $f ----------------------------------------"
psql \
-v ON_ERROR_STOP=1 \
-v dbuser=${SYGAL_USER} \
-f $f
[[ $? -ne 0 ]] && exit 1
done
fi
unset PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD # précaution
--
-- DATABASE, USER, ETC.
--
create database :dbname with ENCODING = 'UTF-8';
create user :dbuser with encrypted password :dbpassword NOSUPERUSER NOCREATEDB;
alter database :dbname owner to :dbuser;
grant all privileges on database :dbname to :dbuser;
......@@ -3,13 +3,13 @@
--
--
-- Sources de données ESUP-SyGAL.
-- Sources de données.
--
delete from source where code = 'SYGAL::sygal'
;
insert into source (id, code, libelle, importable)
values (1, 'SYGAL::sygal', 'ESUP-SyGAL', false)
;
delete from source where code = 'SYGAL::sygal';
delete from source where code = 'HAL';
insert into source (id, code, libelle, importable) values (1, 'SYGAL::sygal', 'ESUP-SyGAL', false);
insert into source (id, code, libelle, importable) values (2, 'HAL', 'HAL', true);
alter sequence source_id_seq restart with 3;
--
-- Pseudo-utilisateur 'sygal-app'.
......@@ -23,23 +23,17 @@ values (1, 'sygal-app', 'Application ESUP-SyGAL', 'ldap')
--
-- Rôles multi-établissements.
--
delete from role where source_code in ('ADMIN_TECH', 'OBSERV')
delete from role where source_code in ('user', 'ADMIN_TECH', 'OBSERV')
;
insert into role (id, code, libelle, source_code, source_id, role_id, these_dep, histo_createur_id, histo_modificateur_id)
values (1, 'ADMIN_TECH', 'Administrateur technique', 'ADMIN_TECH', 1, 'Administrateur technique', false, 1, 1)
insert into role (id, code, libelle, source_code, source_id, role_id, these_dep, histo_createur_id)
values (nextval('role_id_seq'), 'user', 'Authentifié·e', 'user', 1, 'user', false, 1)
;
insert into role (id, code, libelle, source_code, source_id, role_id, these_dep, histo_createur_id, histo_modificateur_id)
values (2 /*241*/, 'OBSERV', 'Observateur', 'OBSERV', 1, 'Observateur', false, 1, 1)
insert into role (id, code, libelle, source_code, source_id, role_id, these_dep, histo_createur_id)
values (nextval('role_id_seq'), 'ADMIN_TECH', 'Administrateur technique', 'ADMIN_TECH', 1, 'Administrateur technique', false, 1)
;
insert into role (id, code, libelle, source_code, source_id, role_id, these_dep, histo_createur_id)
values (nextval('role_id_seq'), 'OBSERV', 'Observateur', 'OBSERV', 1, 'Observateur', false, 1)
;
-- drop sequence INDIVIDU_ID_SEQ;
-- drop sequence UTILISATEUR_ID_SEQ;
-- drop sequence STRUCTURE_ID_SEQ;
-- drop sequence ETABLISSEMENT_ID_SEQ;
-- CREATE SEQUENCE "INDIVIDU_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 NOORDER NOCYCLE ;
-- CREATE SEQUENCE "UTILISATEUR_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 NOORDER NOCYCLE ;
-- CREATE SEQUENCE "STRUCTURE_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 NOORDER NOCYCLE ;
-- CREATE SEQUENCE "ETABLISSEMENT_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 NOORDER NOCYCLE ;
--
-- L'établissement inconnu.
......@@ -64,29 +58,3 @@ select nextval('etablissement_id_seq'),
1, -- source sygal
'ETAB_INCONNU' -- source code unique, idem structure
;
-- --
-- -- Avance de sequences.
-- --
-- declare
-- maxid integer;
-- seqnextval integer;
-- begin
-- select max(id) into maxid from UTILISATEUR;
-- LOOP
-- select nextval('UTILISATEUR_ID_SEQ') into seqnextval from dual;
-- EXIT WHEN seqnextval >= maxid;
-- END LOOP;
-- end;
--
-- declare
-- maxid integer;
-- seqnextval integer;
-- begin
-- select max(id) into maxid from ROLE;
-- LOOP
-- select nextval('ROLE_ID_SEQ') into seqnextval from dual;
-- EXIT WHEN seqnextval >= maxid;
-- END LOOP;
-- end;
Source diff could not be displayed: it is too large. Options to address this: view the blob.
--
-- PREPARATION des données insérées.
--
--
-- Dans certaines tables, on supprime les données dont l'auteur n'existe pas dans une bdd neuve.
--
delete from soutenance_etat where histo_createur_id <> 1 or histo_modificateur_id <> 1; -- 1 = pseudo-utilisateur SyGAL
delete from soutenance_qualite where histo_createur_id <> 1 or histo_modificateur_id <> 1;
delete from soutenance_qualite_sup where histo_createur_id <> 1 or histo_modificateur_id <> 1;
delete from soutenance_qualite_sup where not exists (select * from soutenance_qualite q where qualite_id = q.id);
--
-- Dans certaines tables, on écrase l'auteur avec celui par défaut.
--
update soutenance_etat set histo_createur_id = 1, histo_creation = current_timestamp, histo_modificateur_id = null, histo_modification = null;
update soutenance_qualite set histo_createur_id = 1, histo_creation = current_timestamp, histo_modificateur_id = null, histo_modification = null;
update soutenance_qualite_sup set histo_createur_id = 1, histo_creation = current_timestamp, histo_modificateur_id = null, histo_modification = null;
update formation_enquete_categorie set histo_createur_id = 1, histo_creation = current_timestamp, histo_modificateur_id = null, histo_modification = null;
update formation_enquete_question set histo_createur_id = 1, histo_creation = current_timestamp, histo_modificateur_id = null, histo_modification = null;
update pays set histo_createur_id = 1, histo_creation = current_timestamp, histo_modificateur_id = null, histo_modification = null;
--
-- Préparation des séquences :
-- - currval = max(table.id)
--
drop function if exists init_sequences_values_fdsfdgfd654gs6fd54;
create or replace function init_sequences_values_fdsfdgfd654gs6fd54() returns void
language plpgsql as
$$
declare
v_suffix varchar = '_id_seq';
v_sql text;
begin
for v_sql in
with seqs as (
-- le nom de la table est déduite du nom de la sequence, ex : sequence "utilisateur_id_seq" => table "utilisateur"
select sequence_name, substr(sequence_name, 0, strpos(sequence_name, v_suffix)) table_name
from information_schema.sequences s
where sequence_name like '%' || v_suffix
)
select
'select setval(''' || seqs.sequence_name || ''', coalesce(max(id),1)) ' ||
'from ' || seqs.table_name || ';'
from seqs
join information_schema.tables t on t.table_name = seqs.table_name -- la table doit exister
loop
execute v_sql;
end loop;
end
$$;
select init_sequences_values_fdsfdgfd654gs6fd54();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment