SQL Module3
SQL Module3
SQL Module3
Module n°3
Ordres DML & DDL
PSBDMF!
Programme de Formation de Supinfo
nom_du_schema.nom_de_la_table
Exemple :
SCOTT.EMP
L'identifiant n'est pas sensible à la casse. Oracle permet de contourner les règles de nommage en utilisant la
notation suivante pour les noms de tables ou de colonne :
"nom_de_l'identifiant"
Cette notation permet d'utiliser les mots réservés et d'être sensible à la casse (il est fortement déconseillé
d'utiliser cette notation pour éviter toutes erreurs lors de futures requêtes.)
CHAR (taille) Texte de longueur fixe de taille minimum de 1 caractère et pouvant aller
jusqu'à 2000 caractères.
NUMBER (p, e) Nombre ayant une précision pouvant aller de 1 à 38 chiffres et ayant une
échelle pouvant aller de –84 à 127. (L'échelle est en fait le nombre de chiffre
à afficher après la virgule.)
RAW (taille) Equivalent à VARCHAR2, mais il permet de stocker des données binaires qui
ne sont pas interprétées par Oracle. La taille maximum est de 2000.
LONGRAW Equivalent à LONG mais pour des données de type binaire non interprétées
par Oracle.
BFILE Permet de stocker les données binaires d'un fichier externe pouvant contenir
jusqu'à 4 gigas.
1.2.2 Introduction
Oracle utilise les contraintes afin d'éviter à l'utilisateur de saisir des données erronées dans une table.
Les contraintes permettent aussi de vérifier les opérations d'insertions et d'effacements qui doivent satisfaire
les contraintes existantes.
Les contraintes peuvent être rajoutées ou enlevées après la création de la table. Les contraintes de clé
permettent aussi de faire référencer une colonne (ex: Foreign Key) à une autre colonne (Primary Key). On ne
pourra pas assigner de contraintes à un type de données.
NOT NULL Permet d'empêcher de rajouter des valeurs nulles dans la colonne, (c’est la seule
contrainte à être affichée par la commande DESCRIBE.)
UNIQUE Permet de vérifier que les valeurs entrées ne sont pas déjà présentes dans la
colonne (même si la valeur est nulle). Cette contrainte permet d'être sur d'avoir
des valeurs uniques dans la colonne. Une colonne UNIQUE accepte les valeurs
nulles. De plus Oracle crée automatiquement un index pour cette colonne.
PRIMARY KEY Est définie pour une colonne ou un ensemble de colonnes qui contiendront un
identifiant unique et non nul et qui permettra d'identifier de manière unique un
enregistrement (ou ligne) de la table. La contrainte PRIMARY KEY combine les
contraintes NOT NULL et UNIQUE. Il ne peut y avoir qu'une seule PRIMARY KEY
par table.
FOREIGN KEY Est définie pour une colonne ou une combinaison de colonnes qui font références
à une autre colonne Primary Key dans une table établissant ainsi une relation
entre les deux tables. Les valeurs de la Foreign Key devront correspondre aux
valeurs de la colonne Primary Key à laquelle la Foreign Key fait référence ou
alors être nulle.
CHECK Permet de définir une condition que la colonne doit satisfaire (ex : le numéro de
département devra être compris entre 10 et 99). Il n'y pas de limite sur le nombre
de ce type de contraintes. Elles ne peuvent pas utiliser les commandes :
SYSDATE, UID, USER, USERENV, ou faire des appels sur des lignes.
La seule contrainte qui devra être obligatoirement définie au niveau de la colonne est la contrainte NOT NULL.
Toutes les informations sont disponible dans les vues USER_CONSTRAINTS.
Il est préférable de nommer soit même les contraintes lors de leur création. Si les contraintes ne sont pas
nommées, Oracle sans charge automatiquement. Et dans ce cas, les noms des contraintes ne sont ni
représentatifs ni explicites. Il est donc plus difficile de les retrouver et de les manipuler.
Exemple :
Si la contrainte UNIQUE s'applique à plusieurs colonnes il est possible de les mettre entre parenthèses
et de les séparer par des virgules.
Dans le deuxième exemple la clé primaire sera basée sur les colonnes id1 et id2.
Exemple :
Il y a 3 ordres DML :
Pour exécuter ces trois ordres SQL, l'utilisateur doit posséder les privilèges INSERT, UPDATE et DELETE sur
un objet. De plus si les tables ne sont pas dans son schéma, le propriétaire des tables ou un administrateur
devra donner les droits nécessaires pour pouvoir effectuer des opérations sur ces tables.
Le résultat de ces ordres DML est contrôlé par une transaction (= collection d'ordre DML). Une transaction peut
être administrée par un groupe d'ordres de contrôle de transaction (Transaction Control Statement).
Il y a 3 ordres TCS :
- COMMIT :
Valide tout les ordres DML en attente
- SAVEPOINT :
Permet de fixer des points de sauvegarde qui permettront de revenir en arrière si une erreur se
produit grâce à la commande ROLLBACK. Cette commande ne fait pas partie de la norme SQL
Standard AINSI
- ROLLBACK :
Permet de revenir à l'état avant les transactions DML mais permet de revenir aussi à un
SAVEPOINT.
Exemple:
Si aucunes valeurs n'est spécifiées lors de l'insertion dans une colonne NULL, Oracle insérera
automatiquement une valeur nulle. Si la colonne possède la contrainte NOT NULL, Oracle affichera alors une
erreur. Il n'est possible d'ajouter qu'une seule ligne à la fois avec la clause VALUES.
Exemple :
Attention : La clause VALUES ne doit pas être utilisée dans ce type de requête. De plus le nombre de colonne
passée dans la clause INTO doit correspondre au nombre de colonnes sélectionnées dans la requête
SELECT.
UPDATE nom_table
SET column_name= value [, column_name = value ]
[ WHERE condition ]
Exemple:
La clause SET permet de spécifier les colonnes à modifiées avec leur nouvelles valeurs, la clause WHERE
permet de définir les critères de sélection des lignes ou enregistrements à modifier.
Il est conseillé d'utiliser la clé primaire de la table afin de sélectionner de manière efficace le champ souhaité.
Exemple:
WHERE condititon;
Exemple:
Dans le cas où l'on efface une ligne qui contient une Primary Key, Oracle vérifie automatiquement que celle ci
n'est plus utilisée dans une table fille et si c'est le cas renvoie une erreur. (Il ne faut pas oublier que si une
erreur se produit, 'il est toujours possible de recourir aux ordres TCS.)
SQL> COMMIT;
Tant que vous n'avez pas validez des modifications, Oracle garde en mémoire une image avant (modifications)
qui permet aux autres utilisateurs de pouvoir continuer à travailler et d'exécuter des ordres SELECT sur la table
"avant" que les modifications ne soient intervenues.
Si un autre utilisateur tente de faire une modification sur les lignes que vous modifiez il devra alors attendre
que vous ayez fini et validez ou annuler votre transaction pour pouvoir faire les siennes.
Une transaction pose un verrou sur toutes les données qui vont être modifiées afin d'éviter les redondances. A
la fin de la transaction les verrous sont retirés et les SAVEPOINTS effacés.
Exemple :
SQL> ROLLBACK ;
SAVEPOINT nom;
Exemple:
Il est possible d'utiliser le même nom pour tous les points de sauvegarde, dans ce cas Oracle ne gardera que
le dernier portant ce nom.
La syntaxe pour revenir à un point de sauvegarde est la suivante :
ROLLBACK TO nom_du_savepoint;
Exemple:
Exemple:
Touts les paramètres rencontrés sont identiques à ceux de la commande CREATE TABLE (cf 1.4.1). De plus il
n'est pas possible de spécifier la position d'insertion d'une colonne. Celle-ci est insérée directement à la suite
des autres.
Si les colonnes qui étaient déjà présente dans la table contenaient des valeurs alors la nouvelle colonne sera
initialisée à NULL pour toutes les lignes.
Exemple:
Exemple:
Il n’est possible de supprimer seulement qu’une colonne à la fois. Cette colonne pourra ou non contenir des
données. De plus il n’est possible de supprimer une colonne que si la table contient encore au moins une
colonne après la suppression de la colonne.
La commande CASCADE CONSTRAINTS permet d'effacer aussi les contraintes d'intégrités liées à la colonne
effacée.
La commande INVALIDATE permet aussi d'invalider touts les objets qui faisait références à cette colonne. Un
objet invalidé sera automatiquement validé la prochaine fois qu'un utilisateur y fera référence.
Il est possible de définir des colonnes qui ne sont pas régulièrement utilisées comme étant des colonnes
UNUSED grâce à la syntaxe suivante :
Exemple:
Ceci permet ensuite de supprimer toutes les colonnes inutilisées en une seule fois grâce à la syntaxe :
Exemple:
Une fois qu’une colonne est UNUSED, un ordre SELECT * ne rapportera pas les données de cette colonne.
Exemple:
Comme vu précédemment, il est recommandé de nommer par soit même les contraintes pour des facilités de
déboguage.
Les différents types de contraintes sont les suivants :
- UNIQUE
- CHECK
- PRIMARY KEY
- FOREIGN KEY
Il n'est pas possible de rajouter la contrainte NOT NULL avec la commande ADD CONSTRAINT.
Exemple:
S'il est nécessaire de supprimer la clé primaire de la table il suffira de préciser à la place du nom de la
contrainte PRIMARY KEY. La commande CASCADE vous permettra de supprimer les contraintes FK
automatiquement dans les tables filles.
Exemple:
Lors de l'utilisation de la commande CASCADE sur une PRIMARY KEY toute les FOREIGN KEY qui y font
références sont automatiquement désactivées mais ne seront pas réactivées automatiquement lors de la
réactivation de la PK.
Voici la syntaxe qui va vous permettre de réactiver une contrainte :
Exemple:
La clause VALIDATE permet sous Oracle 8I de vérifier que la contrainte est bien appliquée sur toutes les
nouvelles et anciennes valeurs de la colonne. La clause NOVALIDATE ne vérifiera pas les anciens
enregistrements mais seulement les nouveaux.
Exemple:
Attention DROP TABLE étant un ordre DDL il est auto-commité et valide par conséquent toutes les
transactions en attente.
RENAME ancien_nom_table
TO nouveau_nom_table;
Exemple:
Exemple:
Attention TRUNCATE est un ordre DDL et est donc auto-commité, après son utilisation il faudra désactiver tout
les Foreign Key présentent sur la table.
Seul le propriétaire ou un utilisateur ayant le privilège DELETE ANY TABLE ou DELETE pourra vider une table.
La différence entre TRUNCATE et DELETE est que TRUNCATE ne génère pas d'informations de ROLLBACK
et est donc, par conséquent, plus rapide.
- ALL_COL_COMMENTS
- USER_COL_COMMENTS
- ALL_TAB_COMMENTS
- USER_TAB_COMMENTS
Exemple:
Le paramètre " COLUMN" est optionnel et servira juste à préciser sur quelle colonne porte le commentaire. S'il
n'est pas spécifié, le commentaire portera sur la table.
Pour supprimer un commentaire on en créera un vide (c.a.d en remplaçant le texte par ' ').
4 LES SEQUENCES
Une séquence est un objet de la base de données qui génère des numéros uniques qui pourront être insérés
dans une colonne (comme par exemple une Primary Key).
CACHE n | NOCACHE Met ou non des valeurs en cache (valeur par défaut :
20).
Le nom d'une séquence est composé du nom de la table, à laquelle appartient la colonne qu'elle incrémente, et
le nom de la colonne qu'elle incrémente. Cette convention de nommage permet de retrouver et identifier
facilement les séquences.
Exemple :
Une séquence qui incrémente la colonne empno de la table emp devra s'appeler emp_empno.
Remarque : Attention il est possible de les sélectionner mais pas de faire d'insertion de modification ou
d'effacement dans ces pseudo colonnes.
Pour récupérer la valeur actuelle d'une séquence il suffira de faire appel à la pseudo colonne CURRVAL de la
manière suivante : nom_sequence.CURRVAL.
Pour récupérer la valeur suivante d'une séquence il suffira de faire appel à la pseudo colonne NEXTVAL de la
manière suivante : nom_sequence.NEXTVAL
Exemple :
De plus une séquence ne revient jamais en arrière même si des ROLLBACK sont exécutés. Les valeurs
utilisées ne seront pas remises dans le cache. De même si le système plante, les valeurs, stockées en
mémoire, seront alors perdues.
Exemple :
Exemple:
Il n'est pas possible de changer sa valeur de départ (START WITH) grâce à la commande ALTER
SEQUENCE. Le seul moyen sera d'effacer la séquence et de la recréer.
Après les modifications, Oracle vérifiera alors que celles-ci sont valides (nouveau MAXVALUE supérieur à la
valeur actuelle…)
Exemple:
La création de vues permet de restreindre l'accès à la base évitant ainsi aux utilisateurs d'accéder directement
aux données des tables. Les vues permettent de simplifier les requêtes des utilisateurs et de récupérer des
données compliquées plus facilement sans pour autant écrire une jointure.
Les vues procurent donc une certaine indépendance vis à vis des utilisateurs non expérimentés.
Les vues peuvent aussi fournir un accès spécifique à chaque groupe d'utilisateurs en fonction de leurs critères
particuliers, car on peut créer plusieurs vues des mêmes données. En effet plusieurs vues peuvent être créées
sur les mêmes données.
La différence "basique" entre ces deux types est relative aux opérations DML.
Les vues simples dérivent de données d'une seule table et ne peuvent contenir de fonction de groupe, alors
que les vues complexes sont basées sur plusieurs tables et peuvent contenir des fonctions de groupe.
Attention la requête de l'ordre SQL CREATE VIEW ne peut contenir la clause ORDER BY.
Exemple:
Pour consulter les données d'une vue il est suffit d’utiliser la commande SELECT sur cette vue.
Exemple :
Exemple:
Par exemple on ne pourra supprimer de ligne d'une vue complexe que si celle ci ne contient pas de fonction de
groupe ou une clause GROUP BY ou bien utilise le mot DISTINCT dans sa requête de création.
On ne pourra pas modifier une vue si l'une de ses colonne est de type ROWNUM ou définie par une
expression.
Enfin on ne pourra pas insérer de lignes dans les tables sous-jacentes à cette vue si la vue ne contient pas
toutes les colonnes qui contiennent la contrainte NOT NULL et qu'il faudra obligatoirement remplir.
Par défaut un synonyme n'est accessible que du schéma dans lequel il a été crée.
La clause PUBLIC permet de définir si tout les utilisateurs pourront utiliser ce synonyme. Un synonyme public
devra être unique dans la base.
Exemple:
Les indexes sont indépendant de manière logique et physique des tables qu'ils indexent. Il est donc possible
de les créer et les supprimer sans aucunes répercutions sur les tables qu'ils indexent.
Il faut cependant être vigilant quand à l'utilisation des indexes car ils ne sont pas une garantie quand à
l'augmentation de la vitesse. Car chaque opération DML effectuée force le serveur à mettre à jour les index.
Donc, plus il y aura d'index, plus la mise à jour sera longue.
Ces deux index peuvent se baser sur une ou plusieurs colonnes. Un index multi-colonne pourra contenir
jusqu'à 32 colonnes qui pourront ne pas être adjacentes (dans la même table).
Un indexe crée sur 2 ou plusieurs colonnes est appelé un indexe concaténé (concatenated index).
Il peut aussi être une bonne idée de créer un indexe sur de grosse table dont 5% des lignes sont utilisées.
Il n'est par contre pas intéressant de créer des indexes sur des petites tables (comme EMP ou DEPT), sur des
colonnes peut utilisées ou sur des tables qui sont modifiées régulièrement ou sur des petites colonnes (<50
lignes) car cela diminue la vitesse des requêtes.
Exemple:
De plus il existe différents types de vues du dictionnaire de données qui permettent de consulter ces
informations sur différents niveaux. Ces vues sont préfixées de différentes manières et représentent un niveau
de visibilité différent.
Préfixe Description
USER_ Ces vues contiennent les informations relatives sur les objets
appartenant à l’utilisateur en cours.
ALL_ Ces vues contiennent les informations relatives sur les objets
appartenant à l’utilisateur mais aussi sur ceux qui lui sont
accessible.
DBA_ Ces vues, seulement accessible par les DBA, contiennent toutes les
informations sur tout les objets détenus par les utilisateurs.
V$_ Ces vues contiennent des informations sur les vues dynamiques de
performances, sur les vues dynamiques du dictionnaire et sur les
verrous.
Exemple:
- La sécurité système:
Permet de gérer les mécanismes qui contrôlent les accès et l'utilisation de la base au niveau
système. Cette sécurité est implémentée grâce au nom d'utilisateur et à leur mot de passe. Ce type
de sécurité permet aussi de définir des restrictions d'espace disque pour chaque utilisateur mais
aussi de restreindre leur type d'action.
- La sécurité des données:
Permet de gérer les mécanismes qui contrôlent les accès et l'utilisation de la base au niveau objet.
Toutes ces sécurités sont accessible individuellement par les utilisateurs et permettent de définir
les actions qu'ils pourront effectuer sur ces objets.
Exemple:
Exemple:
Attention il vous faut parfois avoir plusieurs de ces privilèges pour pouvoir effectuer une opération de base. Les
privilèges sont divisés en deux catégories :
CREATE TABLE Permet de créer des tables dans son propre schéma.
DROP ANY TABLE Suppression de table dans tous les schémas. (privilège système)
Pour donner ces privilèges à un utilisateur vous allez utiliser la commande GRANT dont voici la syntaxe :
Exemple:
Exemple:
Exemple:
Si vous utiliser le mot clé PUBLIC, le privilège ou le rôle sera alors accordé à tous les utilisateurs de la base de
données.
Il n'est pas possible d'utiliser WITH GRANT OPTION lors de l'attribution de privilèges à un rôle.
USER_TAB_PRIVS_MADE Contient tout les dons de droits sur des objets appartenant à
l'utilisateur. (Tous les privilèges qu'il a donné sur ses objets)
USER_TAB_PRIVS_RECD Contient toutes les informations sur les privilèges que l'utilisateur à
Laboratoire Supinfo des Technologies Oracle Page 30 / 32
http://www.labo-oracle.com 06/03/2003
Ordres DML & DDL - Version 1.2
reçu.
USER_COL_PRIVS_MADE Contient tout les dons de droits sur des colonnes appartenant à
l'utilisateur. (Tous les privilèges qu'il a donné sur des colonnes de
ses objets)
USER_COL_PRIVS_RECD Contient toutes les informations sur les privilèges que l'utilisateur a
reçus sur des colonnes.
Exemple: