Vous êtes sur la page 1sur 7

TP3 : BASE DE DONNEES AVANCEES

SQL avancé : (S3 :

- Vues 2021/2022)
- Séquencés
- synonymes
- transaction ( verou, savepoint, commit, rollback)

Introduction
Durant ce TP, vous allez appréhender le rôle des objets oracle à savoir les vues, les
séquences et les synonymes, vous allez aussi toucher de prés la gestion des transactions et
de verrou et le rôle de la commande savepoint .
Important : Dans tout le TP vous utiliser le schéma HR , si vous avez oublier le mot
de passe, procéder comme suit pour l’initialiser :
Commande cmd
C:\Users\hp>sqlplus / as sysdba
SQL> alter user hr identified by hr123 account unlock;

- Après cette commande vous avez initialisé le schéma hr avec le mot de


passe hr123
- Vous pouvez faire la même chose à tout utilisateur dont vous avez oublié
le mot de passe !

I- Vues
1. Le service de la paie a besoin d'accéder régulièrement à des informations concernant le
salaire des employés. Le DBA de la société vous a ordonné de créer une vue nommé
vwSalary et basée sur la table ‘EMPLOYEES’. La vue devrait inclure numéro de
l'employé( Employee_id) , son nom et son prénoms et son salaire . Nommez les colonnes
de la vue comme suit: EmpID, EmpLastName, EmpFirstName, et salaireemp. Ecrire le
code SQL nécessaire pour créer cette vue. Ecrire une instruction SELECT pour afficher
les lignes de la vue pour les employés avec des salaires égaux ou supérieurs à $ 3000.
2. Remplacez la vue nommée vwSalary créé en 1 avec une nouvelle vue (même nom), qui
comprend également la colonne ‘Department_id’. Nommez cette colonne ‘departement’
dans la nouvelle vue. Ecrire une instruction SELECT pour afficher les lignes de la vue
contenant les employés de département 80 ayant salaire >= à 1000 $.
3. Créer une vue nommé VU_IT_PG qui contient les enregistrements de la table
EMPLOYEES dont le job_id est IT_PROG
a. Afficher le salaire des IT_PROG
b. Essayer de lancer la requête suivante
Update VU_IT_PG set salary=6000.50 ; commit ;
c. Quel est le salaire actuel des IT_PROG ?
3. Vue avec l’option : WITH CHECK OPTION
 Problème
3.1 On crée tout d’abord la vue ci-dessous l’ordre SQL correspondant
Create view Nom_Emp as select * from EMPLOYEES where firts_name
like ‘J%’

3.2 Puis on essaye d’insérer un enregistrement dans la table EMPLOYEES via la


vue, ci-dessous l’ordre SQL correspondant

insert into Nom_Emp values (6666,'MOHAMED','BARAK','MB@gmail',


'777','17/06/15', 'AD_PRES’,'24000',NULL,NULL,'90');

Est-ce que la ligne est insérer ?

Résultat : La vue est sensé traiter juste les employés dont le prénom commence par ‘J’,
alors qu’elle a pu insérer un employé de prénom ‘'MOHAMED', et pourtant l’insertion a
réussi
Attention on se retrouve dan la table employées avec des données non souhaitées

3.3 Que ce que va se passer en cas d’utilisation des ordres Update et delete sur la vue et la
table d’origine. Essayer l’order update et delete via la vue et verifier
- que remarquer vous ?
- faites aprés rollback pour annuler.

3.4 Supprimer la ligne insérer et supprimer aussi vue Nom_Emp

 Solution
La solution pour ce genre de problème est La clause WITH CHECK OPTION. Elle permet
d'éviter ce type d’insertion. En effet, la clause « with check option » doit être déclaré dans
l’ordre SQL de création de vu comme suit :

3.5 créer la vu avec clause WITH CHECK OPTION

- Create view Nom_Emp as select * from EMPLOYEES where first_name like ‘ J%’
with check option
3.6 insérer un enregistrement dans la table emplyees via la vue crée (Nom_Emp) dans 4.5

insert into Nom_Emp values(5555, 'MOHAMED', 'MOHAMED', 'BARAK','777', '17/06/15',

'AD_PRES’,'24000',NULL,NULL,'90');

3.7 Qu’est-ce que se passe après l’exécution de l’insertion ? commenter ?

3.8 : Insérer un enregistrement valable

4. Vue avec l’option : WITH READ ONLY


a. Redéfinir la vue de créée en 3 ‘VU_IT_PG’ en lecture seule avec le meme
contenu (les enregistrements de la table EMPLOYEES dont le job_id est
IT_PROG)
b. Essayer de lancer la requête suivante
Update VU_IT_PG’ set salary=5000.50

Qu’est-ce que ça passe? Et pourquoi ?

c. Créer une vue en lecture seule nommée lecseul_job_emp contenant le nom,


premon des employés qui ont occupé 2 fonctions ou plus ( 2 Jobs), les tables de
base sont JOB_HISTORY , et EMPLOYEES. Faites des select sur cette vue.
II- Synonymes
1- Se connecter en tant que sysdba, et créer des synonymes public aux tables de shéma
HR comme suit : PEMP pour la table EMPLOYEES, PJO pour la table JOBS , et
PDEP pour la table DEPARTEMENTS.
2- Les synonymes publique ne vont pas marcher si les autres utilisateurs n’ont pas le
droit sur les table pour cela faites :

-sqlplus / as sysdba
- grant select on hr.EMPLOYEES to DIP ;
- grant select on hr.JOBS to DIP ;
- grant select on hr.DEPARTEMENTS to DIP ;
Faites des select et des d’autre ordre SQL en utilisant ces synonymes public, essayer de se
connecter par plusieurs utilisateurs (l’utilisateur DIP, ou autre utilisateur)

1- Dans le schémas HR Créer les synonyme privés suivants : EM pour la table


EMPLOYEES, JO pour la table JOBS , et DEP pour la table DEPARTEMENTS
Faite des select et des d’autre ordre SQL en utilisant ces synonymes. Vérifier que le
synonyme privé n’est pas valide dans les autres schémas

Que remarquer vous ?

III- Séquences
Dans cette partie

- vous vous connecter en tant que ORA_ESTM votre schéma créer dans la 1er séance
de TP, s’il n’existe plus créer le de nouveau
- Créer les deux tables suivantes :
DEPARTEMENT ( id_dep,nom_dept,id_manager, date_affc_manager)
Avec (id_dep : clé primaire)
PROJET(Num_projet,nom_projet, localisation, id_dep_proj*)
Avec ( Num_projet clé primaire et id_dep_proj clé étrangère référence
DEPARTEMENT (id_dep ) )

1. Le Manager des ressources désire numéroter le nouveau département de l’entreprise


de façon séquentielle en commençant par le numéro 40. La numérotation des
départemenst sera incrémentée de 1. Écrire le code nécessaire pour créer cette
sequence, la séquence portera le nom ‘DepartmentSequence’
2.
a- Ecrire l’order SQL pour insérer deux nouvelles lignes dans la table
DEPARTEMENT en utilisant la sequence ‘DepartmentSequence’ créee dans
question 1. Les autres informations à insérer sont indiquées ci-dessous:

 nom_dept = 'Medical Surgical Ward 2’


 nom_dept = ‘Gerontology’
 id_Manager = NULL pour les deux enregistrement
 date_affc_manager = NULL pour les deux enregistrement

b- Ecrire une instruction SELECT pour afficher toutes les lignes de la table de
département trié par id_dep pour les numéros de département supérieures ou
égales à 10.
3.
a- Écrire une commande pour insérer un nouveau projet dans la table du PROJET.
Ce projet sera contrôlé par le département de ‘Gerontology’. Vous pouvez utiliser
la séquence ‘DepartmentSequence’ créé et utiliseé dans la question 1 et 2
(puisque c’est le dernier département inséré dans la table DEPARTEMENT) pour
insérer la nouvelle ligne dans la table PROJET. Les autres informations à insérer
sont représentées ci-dessous.
b- Écrire une instruction SELECT pour afficher la ligne de projet 55. Comparer aux
numéros de départements énumérés à la question 12. S’assurer que la valeur de
id_dep_proj stockée soit correct par rapport au department correspondant (ie
‘Gerontology’) .
 Num_projet = 55
 nom_projet = 'New Inventory Sys'
 localisation = 'Alton'
 id_dep_proj = (généré par le sequence)

IV- Transaction
Une transaction (ensemble d’ordres SQL) est atomique c’st-`a-dire qu’elle ne peut se terminer
que par un sucées (elle est alors validée) ou par un échec (tous ses effets sont alors détruits).

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 modifier les 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’`a ce que le verrou
soit relâché)
Commandes qui provoquent un blocage implicite sur les tables et les lignes impliquées sont :

DELETE, INSERT, UPDATE, ALTER TABLE, ...

1- Faites des sélections sur les mêmes lignes des mêmes tables avec deux session en se
connectant au schéma rh (deux fenêtre cmd S1 et S2 comme illustrer dans le
tableau ci-dessous)
Session S1 Session S2
a- Par exemple, sur S1 et S2 réalisez la même requête qui est :

“Donnez le nom et la date d’embauche des Employés” sur la table EMPLOYEES.

2- Le rôle de commit et rollback


a- Apartir de la session S1
- faites un select sur le salair et le nom l’employé ayant employee_id=105
- augmenter le salair de l’employé employee_id=105 de 50% (update)
- faite un select sur le même employé pour vérifier est ce que le salaire est bien changé
b- Puis de S2 réaliser la même requête : faite un select sur le même employé pour
vérifier est ce que le salaire est bien changé

Que constatez-vous sur S2 ? Et pourquoi ?

c- Revenez à S1 et faites COMMIT


d- Sur S2 : faite un select sur le même employé pour vérifier est ce que le salaire est
bien changé
Que constater vous ?
3- Réessayons avec des commandes provoquant des blocages (verrou)
a- A partir de la session S1 modifie la table EMPLOYEES: “Modifiez le nom
(first_name) de l’employé ‘Lex’ en ‘Lexis’.
b- Puis de S2 réaliser la requête suivante : augmenter le salaire de l’employé
employee_id=102 de 50%
c- Que constater vous sur S2 ? Expliquer ?
d- Revenez à S1 et faites COMMIT ou ROLLBACK.
Que constater vous sur S2 ? Expliquer ?

4 – savepoint et rollback to savepoint :

a- Se connecter en tant que HR et faite les commandes suivantes en un seul coup

1- Update EMPLOYEES set first_name=’TANTA’ where employee_id=107 ;


2- insert into EMPLOYEES values(11111,'KINGSTON','POLO','KP@gamil','777', '17/06/15',
'AD_PRES’,'24000', NULL,NULL,'90');
3- savepoint sav_num1 ;
4- delete from EMPLOYEES where employee_id=105;
5- Update EMPLOYEES set first_name=’TOPAK’ where emplyee_id=108 ;
6- savepoint sav_num2 ;
7- insert into DEPARTMENTS valeus (270, ‘DSI’, null,1700) ;

b- Faite des select pour vérifier toute ces mise à jour


c- Taper et exécuter ensuite la commande : rollback to sav_num1
d- Refaire des select et décrire qu’est ce que s’est passé après rollback to sav_num1

Vous aimerez peut-être aussi