# Démo Oracle — module de démonstration pour **sw**

Clone réduit du module Oracle de [sw](https://git.yaodb-blog.fr), destiné à
faire découvrir l'outil sur une base réelle sans rien exposer d'autre que de la
consultation.

Ce dépôt est **public**. Le module Oracle complet ne l'est pas.

## Ce que fait ce module

- Les rapports de consultation, **identiques** à ceux de la version complète :
  tablespaces et redo logs, mémoire PGA/SGA, indicateurs, sessions actives,
  diagnostic des verrous, historique ASH, diagnostics ORA-01555 / 04030 /
  04031, synthèse des sauvegardes, exports et tables externes, TDE et
  portefeuilles.
- Le **détail d'un SQL_ID** : plans d'exécution, efficacité des plans, texte SQL
  mis en forme, historique des charges.
- L'**historique** : courbe de charge, cartes de chaleur, rapport ASH détaillé
  avec filtrage croisé.
- Les **diagnostics** ORA-01555, ORA-04030, ORA-04031 et ralentissement, et les
  **tableaux de bord** sauvegardes, exports et TDE.
- La même **barre latérale** que le module Oracle complet : une icône par menu,
  sous-menus en survol, repliable et mémorisée.
- Une navigation qui **montre** les fonctions absentes plutôt que de les
  masquer : chaque page réservée explique ce que fait la version complète.

## Ce qu'il ne fait pas

**Aucune action n'est possible sur la base de données.** Arrêt de session,
`ALTER SYSTEM`, redimensionnement de fichier, calcul de statistiques, profils
SQL, points de restauration, politiques d'audit : ces commandes ne sont pas
grisées dans l'interface, elles sont **absentes du code**. Le serveur ne sait
pas les exécuter.

C'est la propriété qui rend le module exposable : griser un bouton ne protège
rien, un `POST` forgé passe outre. Ici il n'y a pas de gestionnaire à atteindre.

Sont également plafonnés :

| Limite | Valeur | Constante |
| --- | --- | --- |
| Bases déclarables | 5 | `DEMO_ORACLE_MAX_DATABASES` |
| Profondeur d'historique | 7 jours | `DEMO_ORACLE_HISTORY_DAYS` |
| Amplitude d'un rapport ASH | 24 heures | `DEMO_ORACLE_ASH_MAX_HOURS` |
| Fenêtre du temps réel | 30 minutes | `DEMO_ORACLE_RT_WINDOW_MINUTES` |
| Dimensions du temps réel | classe d'attente, module, instance | `DEMO_ORACLE_RT_DIMENSIONS` |
| Exécutions listées au SQL Monitor | 20 | `DEMO_ORACLE_SQLMON_MAX_EXECUTIONS` |
| Rafraîchissement du SQL Monitor | 10 secondes | `DEMO_ORACLE_SQLMON_REFRESH_SECONDS` |
| Lignes de plan affichées | 200 | `DEMO_ORACLE_SQLMON_MAX_PLAN_LINES` |

Ces valeurs sont fixées dans `lib/DemoOracleConfig.php`, volontairement hors de
portée de l'interface d'administration.

Enfin, ces pages ne sont pas servies et renvoient vers la version complète :
journal d'alerte, points de restauration, piste d'audit, rapports ASH et AWR,
licences, ordonnanceur et travaux, statistiques système. Dans le détail SQL,
trois onglets sur huit sont dans ce cas — objets liés, statistiques
d'exécution, historique des plans — et les directives **outline** ne sont pas
transmises au navigateur : elles sont la matière première d'un SQL Profile, et
la démonstration ne fixe aucun plan.

## SQL Monitor sans licence Oracle

Le rapport **SQL Monitor** fait exception : il est servi, et c'est le point le
plus démonstratif du module.

Oracle facture le *Real-Time SQL Monitoring* au titre du **Tuning Pack**, et
`DBMS_SQL_MONITOR.REPORT_SQL_MONITOR` n'est qu'un metteur en page au-dessus de
`GV$SQL_MONITOR` et `GV$SQL_PLAN_MONITOR`. La démonstration ne touche à aucune
de ces vues. Elle reconstruit l'essentiel à partir de sources libres :

| Ce qu'on veut | D'où ça vient |
| --- | --- |
| Le plan | `GV$SQL_PLAN` — plan estimé du curseur |
| L'activité par ligne de plan | `GV$SESSION.SQL_PLAN_LINE_ID`, **échantillonnée** à chaque rafraîchissement |
| Mémoire, temporaire, passes | `GV$SQL_WORKAREA_ACTIVE`, dont `OPERATION_ID` *est* l'identifiant de ligne de plan |
| L'avancement | `GV$SESSION_LONGOPS` |
| Les totaux | delta de `GV$SESSTAT` depuis le premier relevé |

Un appel ne donne qu'un instantané ; c'est leur **accumulation**, d'un
rafraîchissement à l'autre, qui reconstitue l'histogramme « où le temps est
passé ». L'état vit dans un fichier temporaire, qui ne contient ni texte SQL
ni identité — seulement des numéros de ligne de plan et des compteurs.

Trois limites, dites en clair dans l'interface plutôt que masquées :

- **les exécutions terminées sont invisibles.** Sans licence il n'existe aucun
  inventaire persistant : une exécution qui s'achève ne laisse aucune trace, et
  la fin est *déduite* de la disparition des sessions ;
- **`STARTS` et les lignes réellement produites n'existent pas.** Ces compteurs
  ne sont instrumentés que par le Real-Time SQL Monitoring. Les colonnes
  affichent « — », jamais 0 ;
- **`V$SESSION.SQL_PLAN_LINE_ID` peut n'être pas alimentée** selon la base. Le
  module le détecte et bascule alors sur une activité globale, sans attribution
  ligne à ligne — le plan, les zones de travail et l'avancement restent.

Si la base *est* licenciée Tuning Pack, la page le signale : la version
complète y lirait alors le vrai Real-Time SQL Monitoring.

## Installation

Deux types de connexion sont acceptés : **directe** (hôte, port, service) et
**Oracle Cloud**, par portefeuille téléchargé depuis la console OCI. Le
portefeuille est extrait sous `securite/`, hors arborescence web, après
inspection de l'archive.

Le module s'installe comme tout module **sw** : dépôt du dossier
`demo_oracle/` sous `mon-appli/modules/`, puis activation depuis
*Administration » Modules*. Il n'a **aucune dépendance** — en particulier, il ne
requiert pas le module Oracle.

Prérequis : PHP 8.2 avec l'extension `oci8` et Oracle Instant Client 19c.

Le nom du dossier doit rester `demo_oracle` : c'est la condition du garde-fou
de mise à jour par ZIP.

## Tester une connexion

Le formulaire de déclaration d'une base porte un bouton **Tester la
connexion**. Outre le succès ou l'échec, il rapporte la version d'Oracle et
trois éléments qui décident de ce que la démonstration pourra montrer :
Diagnostic Pack sous licence, `sw$bash_snapper` installé, rôle DBA présent.

Le rôle DBA est **rapporté, jamais exigé** : le module ne sait rien écrire, un
compte en lecture seule est ce qu'on recommande.

## Configuration

Une seule option, dans *Configuration du module* : l'URL vers laquelle
renvoient les mentions « version complète ». Laissée vide, ces mentions restent
de simples explications, sans lien — le module s'installe alors sans renvoi
commercial.

## Rôles

| Rôle | Ce qu'il permet |
| --- | --- |
| `demo_oracle_admin` | déclarer les bases de démonstration, régler le module |
| `demo_oracle_user` | consulter les rapports |

Il n'y a **pas** de niveaux de droits internes (consultation / dba_dev / dba)
comme dans le module complet : qui accède au module voit tout, en lecture
seule.

## Langues

Quatre traductions réelles : **fr**, **en**, **it**, **pl**. Les fichiers
`de.php`, `es.php` et `ro.php` sont des copies de l'anglais — `I18n::load()`
n'offre aucun repli par module, et une langue absente afficherait les clés
brutes à l'écran.

## Documentation

- [Guide utilisateur](docs/guide-utilisateur.md)
- [Guide administrateur](docs/guide-administrateur.md)
- [Architecture technique](docs/architecture-technique.md)
