Écris les requêtes dans la zone, puis ouvre la réponse pour comparer. Pour les autres questions, réponds avant d’ouvrir : c’est l’effort de rappel qui fait retenir.
Rappel actif
Restitue de mémoire, sans support.
Quatre faits sur le dictionnaire de données : quand est-il créé, à qui appartient-il, quand est-il mis à jour, et comment y accède-t-on ?
- Créé en même temps que la base.
- Appartient à SYS.
- Mis à jour à chaque création ou modification d’objet.
- Pas d’accès direct à ses tables de base : on passe par des vues prédéfinies.
Pour chaque besoin, nomme la vue : objets de mon schéma ; colonnes de mes tables ; mes contraintes ; colonnes concernées par mes contraintes ; mes séquences ; mes synonymes ; mes vues ; la liste des vues du dictionnaire.
USER_OBJECTS,USER_TAB_COLUMNS,USER_CONSTRAINTS,USER_CONS_COLUMNS,USER_SEQUENCES,USER_SYNONYMS,USER_VIEWS,DICTIONARY.
Écris-le
Rédige la requête, la configuration ou le code, puis compare avec la réponse.
Écris la requête qui liste le nom, le type, la date de création et le statut de tous tes objets, triés par type.
SELECT object_name, object_type, created, status FROM user_objects ORDER BY object_type;Le statut
INVALIDsignale par exemple une vue ou une procédure dont une dépendance a changé.Écris la requête qui affiche, pour la table
EMPLOYEES, chaque colonne avec son type, sa longueur, sa précision, son échelle et si elle accepteNULL.SELECT column_name, data_type, data_length, data_precision, data_scale, nullable FROM user_tab_columns WHERE table_name = 'EMPLOYEES';'EMPLOYEES'en majuscules : le dictionnaire stocke les noms non quotés en majuscules.Écris la requête qui affiche les contraintes de
EMPLOYEES: nom, type, condition, contrainte référencée, règle de suppression et statut.SELECT constraint_name, constraint_type, search_condition, r_constraint_name, delete_rule, status FROM user_constraints WHERE table_name = 'EMPLOYEES';r_constraint_namedonne, pour une clé étrangère, la clé primaire ou unique qu’elle référence.Trouve dans
DICTIONARYla description de la vueUSER_OBJECTS.SELECT * FROM dictionary WHERE table_name = 'USER_OBJECTS';Et
DESCRIBE DICTIONARYpour voir les colonnes de la vue elle-même.Écris la requête qui affiche, pour toutes tes séquences, le nom, le minimum, le maximum, le pas et le prochain numéro disponible.
SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
Distingue
Deux notions proches : dis ce qui les sépare vraiment.
USER_OBJECTSetALL_OBJECTS: un utilisateur a reçuSELECTsur la tableHR.EMPLOYEES. Dans laquelle des deux vues la voit-il ?Seulement dans
ALL_OBJECTS.USER_OBJECTSne montre que les objets dont il est propriétaire,ALL_OBJECTStous ceux auxquels il a accès. La table appartient à HR.Vues statiques (
USER_*,DBA_*) et vues dynamiques (V$) : d’où viennent leurs informations, et quand changent-elles ?- Statiques : décrivent la structure (objets, colonnes, contraintes), stockées dans les tables du dictionnaire, mises à jour quand un objet est créé ou modifié.
- Dynamiques
V$: décrivent l’activité en cours, lues en mémoire et dans le fichier de contrôle, constamment mises à jour tant que la base tourne.
USER_CONSTRAINTSetUSER_CONS_COLUMNS: pourquoi a-t-on besoin des deux pour connaître la clé primaire d’une table ?USER_CONSTRAINTSdit qu’une contrainte de typePexiste, avec son nom. Mais pas sur quelles colonnes : c’estUSER_CONS_COLUMNSqui associe chaque contrainte à ses colonnes. Une clé composée y occupe plusieurs lignes. On joint les deux surconstraint_name.
Explique pourquoi
Le mécanisme derrière la règle.
Pourquoi Oracle ne donne-t-il pas d’accès direct aux tables de base du dictionnaire, même à un développeur qui sait ce qu’il fait ?
Elles décrivent toute la base : une écriture incohérente y rendrait la base inutilisable. Les vues donnent une présentation lisible, en lecture, filtrée selon l’utilisateur (
USER_,ALL_). C’est Oracle qui les met à jour, à chaque ordre DDL.Pourquoi
WHERE table_name = 'employees'ne renvoie-t-il rien, alors que la table existe ?Le dictionnaire stocke les noms d’objets non quotés en majuscules : il faut
'EMPLOYEES'. La comparaison de chaînes, elle, est sensible à la casse.
Cas pratique
Choisis et justifie avec les critères du cours.
Une application plante après une modification de table, et le DBA soupçonne des vues devenues invalides. Quelle requête écris-tu ?
SELECT object_name, object_type FROM user_objects WHERE status = 'INVALID';Le DBA veut savoir qui est connecté en ce moment, puis vérifier l’état de ses fichiers journaux. Quelles vues ?
V$SESSIONpour les sessions en cours.V$LOGFILEpour la liste des fichiers journaux,V$LOGpour le statut des groupes (lequel est en cours d’écriture). Ce sont des vuesV$, réservées au DBA.
Vrai ou faux, justifie
La justification compte plus que le verdict.
«
LAST_NUMBERdansUSER_SEQUENCESdonne le dernier numéro déjà distribué par la séquence. »Faux. Selon le cours,
LAST_NUMBERaffiche le prochain numéro disponible, pas le dernier utilisé. (Avec le cache de séquence, c’est même le prochain numéro écrit sur disque, qui peut être en avance sur ce que les sessions ont reçu.)« Les vues
V$restent consultables quand la base est arrêtée, puisqu’elles sont en mémoire. »Faux. La mémoire en question est celle de l’instance : base arrêtée, plus d’instance, plus de
V$. Elles sont lues en mémoire et dans le fichier de contrôle tant que la base est active.