Ce document couvre l’administration du module Oracle.
0. Prérequis et configuration du module
Prérequis
- Extension PHP
oci8+ Oracle Instant Client côté serveur web. Sans elle,
le module s’affiche mais aucune connexion n’est possible.
- Extension
ZipArchivesi vous utilisez des connexions Oracle Cloud
(import du wallet).
- Rôle
oracle_adminpour administrer (le super-rôleapp_adminconvient).
Configuration du module
Le module Oracle n’a pas de page de configuration globale et aucun hook d’activation : il n’y a rien à paramétrer avant de l’activer, et aucun fichier securite/modules/oracle.json n’est créé. L’activation se contente de créer les rôles oracle_admin et oracle_user.
Toute la configuration est applicative et se fait dans les pages du module, dans cet ordre :
- Groupes (§2) — organiser les bases ; le groupe
Defaultexiste d’office. - Bases (§1) — déclarer les connexions (standard ou Cloud/wallet).
- Accès (§3) — attribuer les droits par groupe × sous-groupe.
- Rôles Oracle internes (§4) — facultatif, pour mutualiser des droits.
Les sous-groupes sont figés par l’application : dev, homol, perf, pre-prod, prod, secours.
Données et sauvegarde
Les connexions vivent dans la base applicative (tables oracle_*), les mots de passe y sont chiffrés, et les wallets Cloud sont extraits sous securite/wallets/<id_base>/.
Sauvegardez securite/master.key en même temps que la base applicative : sans cette clé, les mots de passe enregistrés sont irrécupérables.
1. Enregistrement des bases
Accès : oracle_admin uniquement.
Types de connexion

graph TD
A[Nouvelle base] --> B{Type ?}
B -->|Standard| C["host:port/service_name"]
B -->|Cloud / Wallet| D["TNS Alias + fichier wallet ZIP"]
C --> E[Test de connexion]
D --> F[Extraction wallet<br>dans securite/wallets/]
F --> E
E -->|OK| G[Enregistrement]Connexion standard
| Champ | Description |
|---|---|
| Hôte | Adresse IP ou nom DNS du serveur |
| Port | Port du listener (défaut 1521) |
| Service Name | Nom du service Oracle |
Connexion Cloud (wallet)
| Champ | Description |
|---|---|
| TNS Alias | Alias défini dans le tnsnames.ora du wallet |
| Wallet | Fichier ZIP contenant le wallet Oracle Cloud |
Le wallet est extrait dans securite/wallets/<id_base>/. Le fichier sqlnet.ora est automatiquement modifié pour pointer vers le bon répertoire. Les bases cloud ont automatiquement les licences Diagnostic et Tuning Pack.
Champs communs
| Champ | Obligatoire | Description |
|---|---|---|
| Nom | Oui | Identifiant de la base dans l’application |
| Groupe | Oui | Groupe organisationnel |
| Sous-groupe | Oui | Environnement (dev, homol, perf, pré-prod, prod, secours) |
| Utilisateur | Non | Compte Oracle de connexion |
| Mot de passe | Non | Chiffré au repos |
| SYSDBA | Non | Se connecter avec AS SYSDBA |
| Description | Non | Notes libres |
Test de connexion
Le bouton Tester effectue une connexion OCI8 réelle et affiche la version Oracle en cas de succès.
Initialisation de session
À chaque connexion, l’application configure automatiquement :
- Formats NLS (dates ISO-8601, tri binaire)
- Identifiant client (
dbms_session.set_identifier) - Module/Action (
dbms_application_info.set_module) — visible dans
V$SESSION pour l’audit
2. Groupes de bases
Accès : oracle_admin uniquement.

Les bases sont organisées en groupes (ex. “Production”, “Dev/Test”, “Cloud”). Chaque groupe contient des bases réparties en sous-groupes (environnements).
| Action | Description |
|---|---|
| Créer un groupe | Nom unique |
| Renommer | Changement de nom |
| Supprimer | Impossible si le groupe contient des bases. Le groupe “Default” ne peut pas être supprime |
Les groupes servent de base au contrôle d’accès (voir section suivante).
3. Contrôle d’accès Oracle
Accès : oracle_admin uniquement.

Modèle d’accès
L’accès aux bases est contrôle par une matrice principal x groupe x sous-groupe x droit :
graph TD
A[Utilisateur] --> B{Acces ?}
B -->|oracle_admin| C[Toutes les bases]
B -->|app_admin| C
B -->|Acces direct| D[Bases du groupe/sous-groupe octroye]
B -->|Via role Oracle| E[Bases du groupe/sous-groupe du role]
D --> F{Droit ?}
E --> F
F -->|consultation| G[Lecture seule]
F -->|dba_dev| H[Lecture + kill session + correction SQL]
F -->|dba| I[Toutes les actions DBA]Principaux (principals)
Deux types de principals :
| Type | Encodage | Description |
|---|---|---|
| Utilisateur | u:<user_id> | Utilisateur applicatif |
| Groupe AD | a:<DN_encode> | Groupe Active Directory (pour les comptes LDAP) |
Droits
Hiérarchie : dba > dba_dev > consultation.
| Droit | Permet |
|---|---|
consultation | Voir les rapports de la base |
dba_dev | Consultation + kill session + correction SQL (profiles, patches, baselines) |
dba | Tout : consultation + kill + correction SQL + stats, tablespaces, redo logs, scheduler, bash_snapper |
Le helper oracle_right_at_least($right, $minLevel) centralise les comparaisons de niveau.
Interface d’édition
- Vue liste : tableau des principals avec le nombre de
groupes/sous-groupes accessibles
- Vue édition (clic sur un principal) : matrice groupes x
sous-groupes avec sélecteur (—, consultation, dev, dba)
Les changements sont transactionnels : suppression des anciens droits + insertion des nouveaux.
Cas spécial :group_id = NULLsignifie “tous les groupes (présents et futurs)”.subgroup = NULLsignifie “tous les sous-groupes”.
4. Rôles Oracle internes
Accès : oracle_admin uniquement.
Note : ces rôles sont internes au module Oracle et distincts des rôles applicatifs (oracle_admin,oracle_user). Ils sont un mécanisme supplémentaire pour regrouper des permissions d’accès.

Structure
| Table | Description |
|---|---|
oracle_roles | Catalogue des rôles (nom, description) |
oracle_role_perms | Permissions du rôle (group_id, subgroup, right) |
oracle_role_grants | Attribution du rôle à des principals |
Opérations
| Action | Description |
|---|---|
| Créer un rôle | Nom + description |
| Éditer les permissions | Ajouter/retirer des combinaisons groupe + sous-groupe + droit |
| Attribuer | Donner le rôle à des utilisateurs ou groupes AD |
| Supprimer | Supprime le rôle et ses attributions |
La résolution des droits est récursive (un rôle peut inclure d’autres rôles, avec protection contre les cycles).
5. Import/Export de bases
Accès : oracle_admin uniquement.
Export
Généré un fichier JSON contenant toutes les bases enregistrées avec :
- Paramètres de connexion
- Mots de passe (chiffrés)
- Groupe et sous-groupe
- Description
Import
Upload d’un fichier JSON : les bases sont fusionnées dans le registre existant. Les mots de passe sont re-chiffrés si nécessaire. Les wallets associés sont re-extraits.
6. Licences Oracle
Le module détecte automatiquement les licences Diagnostic Pack et Tuning Pack de chaque base.
Détection
| Type de base | Méthode |
|---|---|
| Standard | Lecture de V$PARAMETER.control_management_pack_access |
| Cloud (wallet) | Diagnostic + Tuning toujours considérés comme disponibles |
Impact sur les fonctionnalités
| Fonctionnalité | Licence requise |
|---|---|
| Historique ASH (DBA_HIST_*) | Diagnostic Pack |
| Rapport AWR | Diagnostic Pack |
| Rapport ASH Oracle | Diagnostic Pack |
| SQL Monitor | Tuning Pack |
| Heatmaps | Diagnostic Pack |
| sw$bash_snapper (alternative) | Aucune |
Quand une licence manque, les rapports concernés affichent un bandeau d’avertissement avec la valeur du paramètre CONTROL_MANAGEMENT_PACK_ACCESS.
7. Administration sw$bash_snapper
Contexte
sw$bash_snapper est un package PL/SQL qui échantillonne l’activité des sessions Oracle à la manière d’AWR, sans nécessiter de licence Diagnostic Pack. C’est une alternative gratuite pour les bases sans cette licence.
Prérequis
- Droit DBA sur la base cible
- Compte Oracle avec les privilèges CREATE TABLE, CREATE Procédure,
MANAGE SCHEDULER
Cycle de vie
stateDiagram-v2 [*] --> Non_installe Non_installe --> Installe : Installer Installe --> En_cours : Demarrer En_cours --> Installe : Arreter Installe --> Non_installe : Desinstaller En_cours --> En_cours : Purger
Objets créés
| Table Oracle | Équivalent AWR | Source V$ |
|---|---|---|
SW$BASH_ACTIVE_SESSION_HISTORY | GV$ACTIVE_SESSION_HISTORY | GV$SESSION (1s) |
SW$BASH_HIST_ACTIVE_SESS_HISTORY | DBA_HIST_ACTIVE_SESS_HISTORY | Persistance |
SW$BASH_SNAPSHOT | DBA_HIST_SNAPSHOT | Snapshots horaires |
SW$BASH_HIST_SYSSTAT | DBA_HIST_SYSSTAT | V$SYSSTAT |
SW$BASH_HIST_SYSTEM_EVENT | DBA_HIST_SYSTEM_EVENT | V$SYSTEM_EVENT |
SW$BASH_HIST_SEG_STAT | DBA_HIST_SEG_STAT | V$SEGMENT_STATISTICS |
SW$BASH_HIST_SQLSTAT | DBA_HIST_SQLSTAT | V$SQL top 50 |
SW$BASH_HIST_DATABASE_INSTANCE | DBA_HIST_DATABASE_INSTANCE | V$INSTANCE + V$DATABASE |
SW$BASH_SETTINGS | — | Configuration clé/valeur |
SW$BASH_LOG | — | Journal du collecteur |
Interface d’administration
Depuis le rapport Diagnostics > sw$bash_snapper :

Informations affichées :
- Statut du collecteur (en cours / arrêté)
- Version du package
- Nombre d’échantillons actifs et historiques
- Nombre de snapshots
- Plage de dates des données disponibles
Actions :
| Bouton | Action |
|---|---|
| Installer | Crée tous les objets (tables, index, package, settings) |
| Démarrer | Lance un job DBMS_SCHEDULER par instance active (RAC) |
| Arrêter | Arrêt gracieux via flag |
| Purger | Supprime l’historique > N jours (formulaire) |
| Désinstaller | Supprime tous les objets et jobs |
Paramètres éditables :
| Paramètre | Défaut | Description |
|---|---|---|
sample_every_n_centiseconds | 100 (1s) | Fréquence d’échantillonnage |
persist_every_n_samples | 10 | Nombre d’échantillons avant flush vers l’historique |
max_entries_kept | 30 000 | Taille du buffer circulaire en mémoire |
hist_days_to_keep | 93 | Rétention de l’historique en jours |
snapshot_every_n_samples | 3 600 (1h) | Fréquence des mini-snapshots AWR |
Journal : les 20 dernières entrées du log du collecteur (SW$BASH_LOG) sont affichées en bas de page avec sévérité et message.
Basculement automatique
Quand sw$bash_snapper est installé et que la base n’a pas de licence Diagnostic Pack, les rapports historiques (ASH, heatmaps) basculent automatiquement sur les tables SW$BASH_* au lieu de DBA_HIST_*. Ce basculement est transparent pour l’utilisateur.
8. Opérations DBA
Les opérations suivantes nécessitent le droit DBA sur la base sélectionnée, sauf mention contraire (certaines sont accessibles des dba_dev).
Kill Session (dba_dev+)
Disponible depuis le rapport Temps réel > Sessions actives et Temps réel > Verrous.
- Exécute
ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id' - Confirmation demandée avant exécution
- Protégé par CSRF
Collecte de statistiques (dba)
Disponible depuis le tableau de bord Calcul des stats :
- Bouton “Collecter” en face de chaque table à statistiques périmées
- Exécute
DBMS_STATS.GATHER_TABLE_STATSvia DBMS_SCHEDULER
(exécution asynchrone)
Planification de stats système/dictionnaire
Le bouton Planifier ouvre une modale permettant de lancer un calcul asynchrone via DBMS_SCHEDULER.CREATE_JOB (auto_drop=TRUE) :
| Cible | Procédure Oracle |
|---|---|
| Stats système | DBMS_STATS.GATHER_SYSTEM_STATS |
| Stats dictionnaire | DBMS_STATS.GATHER_DICTIONARY_STATS |
Options :
- Mode (stats système uniquement) :
NOWORKLOAD,INTERVAL,EXADATA - Flush buffer cache : exécute
ALTER SYSTEM FLUSH BUFFER_CACHE
avant la collecte
Correction SQL (dba_dev+)
Disponible depuis la page Détail SQL :
| Action | Package Oracle |
|---|---|
| Créer un SQL Profile | DBMS_SQLTUNE.IMPORT_SQL_PROFILE |
| Créer un SQL Patch | DBMS_SQLDIAG.CREATE_SQL_PATCH (12c+) |
| Créer une SQL Plan Baseline | DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE |
| Supprimer un SQL Profile | DBMS_SQLTUNE.DROP_SQL_PROFILE |
| Supprimer un SQL Patch | DBMS_SQLDIAG.DROP_SQL_PATCH |
Suppression de SQL Profiles (page Tuning SQL)
La page Config > Tuning SQL affiche la liste des SQL Profiles existants. Les DBA peuvent supprimer un profil directement depuis cette page via le bouton Supprimer en colonne Actions.
Tablespaces & Redo Logs (dba)
Disponible depuis le rapport Config > Tablespaces & Redo Logs :
Redimensionnement de datafiles
Le nom de chaque tablespace data (souligné, cliquable des le premier affichage du graphique) ouvre une modale qui chargé la liste des datafiles via AJAX, puis permet de modifier la taille de chacun.
- Exécute
ALTER DATABASE DATAFILE '<path>' RESIZE <N>M - Validation : le chemin du fichier est vérifie contre
DBA_DATA_FILES
avant exécution (protection injection)
Gestion des redo log groups
| Action | Commande Oracle |
|---|---|
| Ajouter un groupe | ALTER DATABASE ADD LOGFILE THREAD <n> GROUP <g> SIZE <s>M |
| Supprimer un groupe | ALTER DATABASE DROP LOGFILE GROUP <g> |
| Supprimer un thread | Supprime tous les groupes INACTIVE du thread |
Redimensionnement de tous les redo logs
Bouton Redimensionner tous les redo logs : recrée chaque groupe avec la nouvelle taille. L’opération procède par :
- Log switch (
ALTER SYSTEM SWITCH LOGFILE) + checkpoint - Drop de chaque groupe INACTIVE
- Recréation avec la nouvelle taille
- Groupes ACTIVE/CURRENT traités en dernier après nouveau switch
Le résultat affiche le nombre de groupes recréés, ignorés et en erreur.
Gestion DBMS_SCHEDULER (dba)
Disponible depuis le tableau de bord Scheduler :
| Action | Commande Oracle |
|---|---|
| Activer un job | DBMS_SCHEDULER.ENABLE('<owner>.<name>') |
| Désactiver un job | DBMS_SCHEDULER.DISABLE('<owner>.<name>', force=>TRUE) |
| Supprimer un job | DBMS_SCHEDULER.DROP_JOB('<owner>.<name>', force=>TRUE) |
La suppression demande une confirmation. Toutes les actions sont protégées par CSRF et droit DBA.
Gestion sw$bash_snapper (dba)
Installation, démarrage, arrêt, purge et désinstallation du collecteur (voir section 7).
Statistiques & Auto Tuning (dba)
Depuis les pages Configuration → Calcul des statistiques et Configuration → Tuning SQL :
| Action | Mécanisme Oracle |
|---|---|
| Modifier une préférence globale DBMS_STATS | DBMS_STATS.SET_GLOBAL_PREFS |
| Planifier un calcul system/dictionary stats | DBMS_STATS.GATHER_SYSTEM_STATS / GATHER_DICTIONARY_STATS (via DBMS_SCHEDULER) |
| Activer/désactiver « auto optimizer stats collection » | DBMS_AUTO_TASK_ADMIN.ENABLE/DISABLE |
| Modifier un paramètre de l’Auto SQL Tuning Advisor | DBMS_SQLTUNE.SET_AUTO_TUNING_TASK_PARAMETER |
| Activer/désactiver « sql tuning advisor » | DBMS_AUTO_TASK_ADMIN.ENABLE/DISABLE |
| Supprimer un SQL Profile | DBMS_SQLTUNE.DROP_SQL_PROFILE |
Toutes ces actions sont protégées par CSRF et exigent le droit DBA.
TDE — passage en auto-login (dba / app_admin)
Depuis le tableau de bord TDE / Wallets, un bouton « Passer en auto-login » est propose aux utilisateurs ayant le droit DBA sur la base ou le rôle app_admin (administrateur du site), et uniquement si le wallet n’est pas déjà en auto-login.
Une fenêtre modale demande le mot de passe du keystore et, en option, un auto-login local (LOCAL_AUTO_LOGIN, lié à l’hôte — deconseille en RAC car le wallet ne peut être copie vers un autre nœud).
L’action exécute :
ADMINISTER KEY MANAGEMENT CREATE [LOCAL] AUTO_LOGIN KEYSTORE
FROM KEYSTORE '<emplacement>' IDENTIFIED BY "<mot_de_passe>";
- L’emplacement du keystore est lu côté serveur (
V$ENCRYPTION_WALLET),
jamais fourni par le client.
- Le mot de passe est inline dans le DDL : les guillemets doubles et
sauts de ligne sont refusés (validation côté serveur). Il n’est pas journalisé par l’application.
- La connexion Oracle doit disposer du privilège SYSDBA / SYSKM (ou
ADMINISTER KEY MANAGEMENT) ; sinon l’erreur ORA- est renvoyée.
- Effet diffère : le keystore auto-login (
cwallet.sso) est créé mais ne
devient actif qu’au prochain redémarrage de l’instance (ou après fermeture / réouverture du keystore).

Annexe : Schéma du module Oracle
erDiagram
oracle_databases ||--o{ oracle_access : "controle par"
oracle_groups ||--o{ oracle_databases : "contient"
oracle_roles ||--o{ oracle_role_perms : "a pour permissions"
oracle_roles ||--o{ oracle_role_grants : "attribue via"
oracle_databases {
int id PK
text name
int group_id FK
text subgroup
text connection_type
text host
int port
text service_name
text tns_alias
text username
text password
int sysdba
text description
}
oracle_groups {
int id PK
text name UK
}
oracle_access {
int id PK
int user_id FK
text ad_group
int group_id FK
text subgroup
text right
}
oracle_roles {
int id PK
text name
text description
}
oracle_role_perms {
int id PK
int role_id FK
int group_id FK
text subgroup
text right
}
oracle_role_grants {
int id PK
int role_id FK
int user_id FK
text ad_group
}