Bases de Données TP Transactions et Gestion des Droits Utilisateurs 1. Dictionnaire de données Nous rappelons que le dictionnaire de données est un ensemble de tables dans lesquelles sont stockées les descriptions des objets de la base. Les tables de ce dictionnaire peuvent être consultées au moyen du langage SQL. Des vues de ces tables permettent à l utilisateur de voir les objets qui lui appartiennent (tables préfixées par USER) ou sur lesquels il a des droits (tables préfixées par ALL). L administrateur a pour sa part accès à toutes les vues (les tables précédentes ainsi que les tables préfixées par DBA). Quelques vues et tables du dictionnaire de données : USER TABLES: tables et vues créées par l utilisateur ; USER CATALOG (ou CAT) : tables et vues sur lesquelles l utilisateur a des droits à l exception des tables et vues du dictionnaire de données ; USER TAB COLUMNS (ou COLS) : colonne de chaque table ou vue créée par l utilisateur courant ; USER CONSTRAINTS : définition des contraintes pour les tables des utilisateurs ; USER CONS COLUMNS : colonnes qui interviennent dans les définitions des contraintes ; USER TAB PRIVS : droits attribués et/ou reçus par l utilisateur USER SYS PRIVS : privilèges donnés à l utilisateur de manière générale ; USER TAB PRIVS MADE : droits attribués par l utilisateur ; USER TAB PRIVS RECD : droits reçus par l utilisateur ; ALL CATALOG : liste de tous les objets accessibles par l utilisateur ; ALL TABLES Description des tables accessibles par l utilisateur. Connectez vous et effectuer les requêtes suivantes : 1. Créer une table TEST( A smallint, B smallint, C varchar2(20)) et la contrainte TESTPK (clé primaire sur a) et insérer une dizaine de n-uplets dans TEST 1
GLIN605-2011-2012 2 2. Donner toutes les informations sur les tables sur lesquelles vous avez des droits 3. Donner le nombre d attributs de la table TEST 4. Donner la liste des contraintes (avec leur statut) créées 5. Donner les informations sur les contraintes de type clé primaire que vous avez créées 2. Privilèges d accès à la base de données Oracle permet à plusieurs utilisateurs de travailler sur la mme base de données en toute sécurité. Deux commandes sont à ce titre particulièrement importantes: GRANT et REVOKE et permettent de définir les droits de chaque utilisateur sur les objets de la base. Tout utilisateur accède à la base à l aide de son nom utilisateur et de son mot de passe. C est le nom utilisateur qui permet de déterminer les droits d accès aux objets de la base de données. En tant qu utilisateurs vous avez été créés par le DBA et vous avez été autorisés à vous connecter à la base Oracle Licnce. Vous avez aussi les privilèges de créer des objets de schéma de base de données utilisateur (tables, vues, contraintes etc). Lorsque dans une session de TP vous avez travaillé sous le nom d un utilisateur, vous n avez donc pas été en concurrence avec d autres utilisateurs. Nous allons vérifier que le SGBD gère la concurrence d accès à des objets de la base entre plusieurs utilisateurs (identiques ou différents). Tout utilisateur qui crée des objets est propriétaire de ces objets (table name, owner de USER tables dans le dictionnaire des données). Le créateur d un objet peut décider de donner (ou de supprimer) certains droits d accès à cet objet à tout autre utilisateur de sa connaissance. 2.1 L ordre GRANT GRANT privilege ON table/vue TO utilisateur [WITH GRANT OPTION] Cet ordre permet de donner le privilège concerné sur la table ou la vue à l utilisateur. Exemple : X a créé la table TEST et veut autoriser Y à lire cette table. Il passe alors l ordre GRANT SELECT ON TEST TO Y; Les privilèges qui peuvent tre donnés sont les suivants: 1. SELECT : droit de lecture ; 2. INSERT : droit d insertion de lignes ; 3. UPDATE : droit de modification de lignes ; 4. DELETE : droit de suppression de lignes ; 5. ALTER : droit de modification de la définition de la table ; 6. INDEX : droit de création d index ;
GLIN605-2011-2012 3 7. ALL : tous les droits ci-dessus. Un utilisateur ayant reçu un privilège avec la mention facultative WITH GRANT OPTION peut les transmettre à son tour à un autre utilisateur. Pour la suite du TP vous allez donc fonctionner par paire (X connecté sur la machine m1 et Y connecté sur la machine m2). X (Y) donne les droits de lecture de sa table TEST à l utilisateur Y (X) X (Y) donne les droits de modification de sa table à l utilisateur Y (X) Vérifier que les privilèges ont été bien accordés Testez vos nouveaux droits (les objets que vous interrogerez et dont vous n êtes pas propriétaire sont désignés par leur nom complet nompropriétaire.nomobjet). 2.2 L ordre REVOKE Un utilisateur ayant accordé un privilège peut le reprendre à tout moment à l aide de l ordre REVOKE. REVOKE privilege ON table/vue FROM utilisateur Enlever les privilèges précédemment accordés Vérifier que les privilèges ont bien été supprimés 3. Gestion des accès concurrents Une transaction (ensemble d ordres SQL) est atomique c est-à-dire qu elle ne peut se terminer que par un succés (elle est alors validée COMMIT) ou un échec (tous ses effets sont alors détruits ROLLBACK). En conséquence, en contexte multi-utilisateurs, les modifications effectuées par une transaction réalisée par un utilisateur ne sont connues des autres utilisateurs que lorsque la transaction a été confirmée par un COMMIT. Oracle gère automatiquement les accés concurrents. Si une transaction est en train de modifier les lignes d une table, les autres transactions peuvent accéder aux données telles qu elles étaient avant ces dernières modifications (pas de temps d attente pour la lecture). Pour rester simple nous dirons que toute transaction pose des verrous sur les objets qu elle manipule et que deux grands types de verrous existent : en lecture (verrou passant plusieurs lectures simultanées peuvent avoir lieu) en écriture (verrou bloquant la première écriture bloque les autres jusqu à ce que le verrou soit relaché) Commandes qui provoquent un blocage implicite sur les tables et les lignes impliquées : DELETE, INSERT, UPDATE, ALTER TABLE,... Le mode pour les transactions peut être
GLIN605-2011-2012 4 READ ONLY pour les transactions n effectuant que des lectures READ WRITE pour les transactions effectuant lectures et écriture (mode par défaut d ORACLE ) pouvant être complétés par l introduction d un niveau d isolation grâce à l instruction SET TRANSACTION ISOLATION LEVEL < niveau >, niveau pouvant être READ UNCOMMITTED, READ COMMITED, REPETEABLE READ et SERIALIZABLE (en Oracle seuls READ COM- MITED, et SERIALIZABLE ) Remarque : en mode READ WRITE le niveau d isolation READ COMMITED peut entraîner lectures non répétables et lecture de fantôme, le niveau d isolation SERIALIZABLE interdit tout phénomène indésirable. 3.1 Transactions au sein d une connexion unique L objectif est de voir l effet du commit et du rollback. Tester et noter les observations dans la session que vous avez ouverte : create table X (n Number (2)) ; insert into X values (1) ; commit ; insert into X values (2) ; rollback ; commit ; Effet des instructions du langage de définition Un ordre du langage de définition des données forme une transaction à lui tout seul. L exécution d un tel ordre effectue un commit puis s exécute et si tout s est bien passé un nouveau commit est effectué, sinon (en cas d erreur) la transaction n est pas terminée. Tester et noter vos observations : insert into X values (55) ; create table Y (n Number (2)) ; insert into X values (56) ; rollback ; 3.2 Transactions concurrentes 1. Nous commencerons par tester la concurrence entre deux sessions ouvertes par un même utilisateur. Pour cela, ouvrez deux sessions sous votre login.
GLIN605-2011-2012 5 Faites des modifications (du type LMD, pas de create ou de drop) dans une des sessions (sur la table EMP) et voyez si les modifications sont connues de l autre session. Faites un COMMIT des modifications et voyez si les modifications sont connues de l autre session. Modifiez le salaire d un même employé dans les deux sessions (avec des valeurs diffèrentes). Que se passe-t-il? Faites un COMMIT sur la session qui a fait les modifications en premier. Que se passe-t-il? Faites un select dans les 2 sessions pour voir la modification. Faites un COMMIT dans la deuxième session. Faites un select dans les 2 sessions pour voir la modification. Utilisez un SELECT FOR UPDATE sur une des sessions et essayez de modifier les lignes bloquées avec l autre session. 2. Nous poursuivrons en testant la concurrence utilisateurs bénéficiant de droits analogues sur des tables communes. L utilisateur tlibourel vous a donné la globalité de droits sur ses tables tlibourel.emp et tlibourel.dept (correspondant aux tables du script Création des premiers TP) Faites des sélections sur les mêmes lignes des mêmes tables. Par exemple, réaliser la même requête : Donnez le nom et la date dembauche des employés de la table tlibourel.emp. Réessayez le même exercice mais avec des commandes provoquant des blocages. Par exemple, X modifie la table tlibourel.emp : Modifiez le nom de lemployé BALIN en BALUN. Puis X et Y réalisent la même requête : Donnez le nom et la date d embauche des employés sur la table tlibourel.emp. Constatations. Tester avec COMMIT et ROLLBACK. 3. Vous poursuivrez en bénéficiant des droits que vous vous êtes alloués (cf. section 2) par paire d utilisateurs X et Y (sur vos tables mutuelles EMP et DEPT). Etreinte mortelle (DEADLOCK) : X fait un UPDATE sur le tuple i de la table EMP Y fait un UPDATE sur le tuple j de la table DEPT X fait un UPDATE sur le tuple j de la table DEPT Y fait un UPDATE sur le tuple i de la table EMP Constatations. Quelles sont les opérations qui ont été effectivement effectuées sur les tables concernées Tester les transactions concurrentes (selon le schéma du tableau 1 ) en mode isolation READ COMMITTED Que constatez-vous?
GLIN605-2011-2012 6 Table 1: premier essai T1 T2... UPDATE TEST set B= B+40 where A=2; // blocage UPDATE TEST set C= abc where A=1; // déblocage T3 SELECT * FROM TEST; UPDATE TEST set C= def where A=1; SELECT * FROM TEST; Table 2: deuxième essai T1 T2... UPDATE TEST set B= B-40 where A=1; UPDATE TEST set B= 0 where A=1; // blocage interblocage détecté - si T1 avortée ROLLBACK; //blocage // si T2 avortée ROLLBACK
GLIN605-2011-2012 7 Tester les transactions concurrentes (selon le schéma du tableau 2) en mode isolation READ COMMITTED Que constatez-vous? Tester les transactions concurrentes en mode READ ONLY. Que constatez-vous? Mettez en concurrence une transaction READ ONLY et une transaction READ WRITE en niveau READ COMMITTED. Que constatez-vous? Tester des transactions READ WRITE (selon le schéma du tableau 3) en niveau d isolation SERIALIZABLE Que constatez-vous? Faire Table 3: troisième essai T1 SELECT A FROM TEST WHERE B=1; T3 INSERT INTO TEST VALUES(20,100, aze ); UPDATE TEST SET B=20 WHERE A=25; T2 SELECT A FROM TEST WHERE B=1; //commentaire T4 INSERT INTO TEST VALUES(25,10, fgh ); UPDATE TEST SET B=10 WHERE A=20; //commentaire un résumé commentaire de vos diverses observations.