Vous êtes sur la page 1sur 15

ISG Tunis 3ème LFIG

TD BD Repartie 2013/2014

-Les Vues, Les Déclencheurs, Les vues matérialisées


et Les Clichés-

Les vues :
1. Définition et intérêts :

Une Vue est une table logique pointant sur une ou plusieurs tables ou vues et ne contient physiquement
pas de données.
Il est possible de rassembler, dans une vue, des informations provenant de plusieurs tables. On parle
de "vue" car il s'agit simplement d'une représentation des données dans le but d'une exploitation
visuelle. Les données présentes dans une vue sont définies grâce à une clause SELECT.

Une vue peut être filtrée, interrogée avec des jointures, des sous-requêtes, …

Une Vue permet de limiter l'accès à des données dans la base de données.

Une Vue peut faciliter la création de requêtes complexes via la création de raccourci ou d'alias.

Une Vue permet de présenter des données issues d'une table sous de différents formats.

La structure d'une Vue est stockée dans le dictionnaire de données et peut contenir 1000 colonnes.
2. Syntaxe :

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW [( nom colonne1 [,nom


colonne2]...)] AS SELECT ...WITH { READ ONLY | CHECK OPTION [
CONSTRAINT La contrainte ] }

3. Exemples :
Dans les exemples ci-dessous nous considérons la base de données Scott ayant le schéma suivant :

Emp ( empno, ename, job, mgr, hiredate, sal, comm, deptno# )


Dept ( deptno, dname, loc )
a. Exemple 1 :

SQL> CREATE VIEW Les_emp_dept_10 AS

SELECT ename, job, sal, deptno

FROM emp

1
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

WHERE deptno = 10;

Vue créée.

Examiner la description de la vue crée :

SQL> DESC Les _emp_dept_10;

Nom NULL ? Type

----------------------- -------- --------------

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

SAL NUMBER(7,2)

DEPTNO NUMBER(2)

Examiner le type de chaque colonne de la vue crée (est elle modifiable ou non ?)

SQL> SELECT column_name, updatable

FROM user_updatable_columns

WHERE table_name = ' LES_EMP_DEPT_10';

COLUMN_NAME UPD

------------------------------ ---

ENAME YES

JOB YES

SAL YES

DEPTNO YES

b. Exemple 2 : création d’une vue avec des opérations numériques

SQL> CREATE VIEW Les_emp_dept_10 AS

SELECT ename, job, sal*1.33 SAL, deptno

2
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

FROM emp

WHERE deptno = 10;

Vue créée.

SQL> DESC Les_emp_dept_10;

Nom NULL ? Type

----------------------- -------- --------------

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

SAL NUMBER

DEPTNO NUMBER(2)

SQL> SELECT column_name, updatable

FROM user_updatable_columns

WHERE table_name = ' LES_EMP_DEPT_10';

COLUMN_NAME UPD

------------------------------ ---

ENAME YES

JOB YES

SAL NO

DEPTNO YES

Vous remarquer que la colonne Sal est en lecture seule.

c. Exemple 3 : l’exemple suivant montre la création d’une vue en précisant les noms des
colonnes.

SQL> CREATE VIEW Les_emp_dept_10

3
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

(nom, metier, salaire, depart) AS

SELECT ename, job, sal*1.33, deptno

FROM emp

WHERE deptno = 10;

Vue créée.

SQL> DESC Les_emp_dept_10;

Nom NULL ? Type

--------------------------- -------- ---------------

NOM VARCHAR2(10)

METIER VARCHAR2(9)

SALAIRE NUMBER

DEPART NUMBER(2)

d. Exemple 4 : la création d’une vue en lecture seule. Alors les actions update, insert et delete
sont interdites.

SQL> CREATE VIEW Les_emp_dept_10

(nom, metier, salaire, depart) AS

SELECT ename, job, sal, deptno

FROM emp

WHERE deptno = 10

WITH READ ONLY;

Vue créée.

SQL> SELECT column_name, updatable

FROM user_updatable_columns

4
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

WHERE table_name = 'LES_EMP_DEPT_10';

COLUMN_NAME UPD

------------------------------ ---

NOM NO

METIER NO

SALAIRE NO

DEPART NO

Vous remarquez bien que le champ updatable est à NO pour toutes les colonnes.

e. Exemple 5 : L'option WITH CHECK OPTION ou WITH CHECK OPTION CONSTRAINT crée
une contrainte de vérification sur la vue à partir de la clause WHERE.
Les vues créées avec l'option WITH CHECK OPTION CONSTRAINT empêche toutes mises à
jour de la Vue si les conditions de la clause WHERE ne sont pas respectées.

SQL> CREATE VIEW Les_emp_dept_10

(nom, metier, salaire, depart) AS

SELECT ename, job, sal, deptno

FROM emp

WHERE deptno = 10

WITH CHECK OPTION CONSTRAINT check_10;

Vue créée.

SQL> INSERT INTO Les_emp_dept_10

(nom, metier, salaire, depart)

VALUES('Daniel','DBA',4000,78);

Cette requête engendre l’erreur suivante :

5
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

INSERT INTO Les_emp_dept_10

ERREUR à la ligne 1 :

ORA-01402: vue WITH CHECK OPTION - violation de clause WHERE

SQL> INSERT INTO Les_emp_dept_10

(nom, metier, salaire, depart)

VALUES('Daniel','DBA',4000,10);

1 ligne créée.

Remarque :

FORCE VIEW permet de créer des vues lorsque la table ou les tables utilisées pendant la
création ne sont pas disponibles dans votre environnement, alors la Vue
sera INVALIDE mais existante.
Avec NOFORCE (valeur par défaut), si les tables n'existent pas, la vue n'est pas créée.
Les développeurs oracle peuvent se retrouver dans des situations d'urgences de
développement, ou ils sont obligés de forcer la création de vue car des privilèges sont
manquants sur les Objets ou alors l’administrateur de la BD n'a pas encore eu le temps de
créer les tables...

Les déclencheurs :
1. Définition :

Un trigger est une procédure qui est géré automatiquement par la base de données et qui est
associée à un événement donné (BEFORE UPDATE, AFTER DELETE, AFTER INSERT, …). Si
l’événement arrive alors l’exécution de la procédure est lancée automatiquement pour modifier les
tables sur lesquelles porte le trigger.

Les déclencheurs (TRIGGERS en anglais) sont par exemple, utiles pour propager des opérations
de mise à jour (INSERT, UPDATE, DELETE) d'une table afin de garder la cohérence de la base.
On distingue deux types de triggers DML différents :
Les triggers table (STATEMENT) à déclenchement unique.
Les triggers ligne (ROW) à déclenchement sur chaque ligne.

6
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

2. Syntaxe :

CREATE [ OR REPLACE ] TRIGGER [ schema. ]trigger

{ BEFORE | AFTER | INSTEAD OF }

{ DELETE | INSERT | UPDATE

[ OF column [, column ]... ]

[ OR { DELETE | INSERT | UPDATE

[ OF column [, column]... ]

]...

ON { [ schema. ]table

[ FOR EACH ROW ]

ON { [ schema. ]SCHEMA

[ WHEN (condition) ]

Block_pl/sql

};

3. Exemples :

Trigger Pour Insertion:

7
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

Trigger avant insertion :

Soit la table orders( order_id, quantity, cost_per_item, total_cost, create_date, created_by)

CREATE OR REPLACE TRIGGER orders_before_insert

BEFORE INSERT -- avant insertion

ON orders --sur la table orders

FOR EACH ROW -- pour chaque ligne de la table

DECLARE

v_username varchar2(10);

BEGIN

-- Déterminer le nom de l’utilisateur qui tente à insérer dans la table

SELECT user INTO v_username

FROM dual;

-- Modifier la date de la création par la date système

:new.create_date := sysdate;

-- modifier le champ created_by et y affecter l’utilisateur detrminé ci-dessus

:new.created_by := v_username;

END;

Trigger après insertion :

CREATE OR REPLACE TRIGGER orders_after_insert

AFTER INSERT

ON orders

FOR EACH ROW

DECLARE

8
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

v_username varchar2(10);

BEGIN

-- Déterminer le nom de l’utilisateur qui a effectué l’insertion dans la table

SELECT user INTO v_username

FROM dual;

-- Insérer une ligne dans la table orders_audit

INSERT INTO orders_audit

( order_id, quantity, cost_per_item, total_cost, username )

VALUES

( :new.order_id, :new.quantity, :new.cost_per_item, :new.total_cost, v_username );

END ;

Trigger Pour Modification:

Trigger avant modification :

Soit la table orders( order_id, quantity, cost_per_item, total_cost, updated_date, updated_by)

CREATE OR REPLACE TRIGGER orders_before_update

BEFORE UPDATE

ON orders

FOR EACH ROW

DECLARE

v_username varchar2(10);

BEGIN

SELECT user INTO v_username

FROM dual;

9
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

-- modifier la date de modification à la date courante

:new.updated_date := sysdate;

-- affecter le nom de l’utilisateur qui a effectué la modification

:new.updated_by := v_username;

END;

Trigger après modification :

Soit la table orders(order_id, quantity, cost_per_item, total_cost)

CREATE OR REPLACE TRIGGER orders_after_update

AFTER UPDATE

ON orders

FOR EACH ROW

DECLARE

v_username varchar2(10);

BEGIN

SELECT user INTO v_username

FROM dual;

INSERT INTO orders_audit

( order_id, quantity_before, quantity_after, username )

VALUES

( :new.order_id, :old.quantity, :new.quantity, v_username );

END;

Trigger Pour Suppression:

Trigger avant suppression :

10
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

Soit la table orders( order_id, quantity, cost_per_item, total_cost)

CREATE OR REPLACE TRIGGER orders_before_delete

BEFORE DELETE

ON orders

FOR EACH ROW

DECLARE

v_username varchar2(10);

BEGIN

SELECT user INTO v_username

FROM dual;

-- inserer une ligne dans la table orders_audit

INSERT INTO orders_audit

( order_id, quantity, cost_per_item, total_cost, delete_date, deleted_by )

VALUES

( :old.order_id, :old.quantity, :old.cost_per_item, :old.total_cost, sysdate, v_username );

END;

Trigger après suppression :

Soit la table orders( order_id, quantity, cost_per_item, total_cost)

CREATE OR REPLACE TRIGGER orders_after_delete

AFTER DELETE

ON orders

FOR EACH ROW

DECLARE

11
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

v_username varchar2(10);

BEGIN

SELECT user INTO v_username

FROM dual;

INSERT INTO orders_audit

( order_id, quantity, cost_per_item, total_cost, delete_date, deleted_by)

VALUES

( :old.order_id, :old.quantity, :old.cost_per_item, :old.total_cost, sysdate, v_username );


END;

Trigger sur plusieurs actions (avant ou après insertion, modification, suppression) :

CREATE OR REPLACE TRIGGER TRG_BIUDR_EMP

BEFORE INSERT OR UPDATE OR DELETE -- avant insertion, modification ou suppression


ON orders -- sur la table orders

FOR EACH ROW -- pour chaque ligne

Begin

If INSERTING Then dbms_output.put_line( 'Insertion dans la table EMP' ) ;

End if ;

If UPDATING Then dbms_output.put_line( 'Mise à jour de la table EMP' ) ;

End if ;

If DELETING Then dbms_output.put_line( 'Suppression dans la table EMP' ) ;

End if ;

End ;

12
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

Supprimer un Trigger :

DROP TRIGGER trigger_name;

Activer/Désactiver un Trigger :

ALTER TRIGGER trigger_name DISABLE; -- Désactiver un seul trigger

ALTER TABLE table_name DISABLE ALL TRIGGERS; -- Désactiver tous les triggers d’une
table

ALTER TRIGGER trigger_name ENABLE; --Activer un trigger

ALTER TABLE table_name ENABLE ALL TRIGGERS; -- Activer tous les triggers d’une table

Les Vues Matérialisées :


1. Définition et intérêts :

Une vue matérialisée (VM) est un moyen simple de créer une vue physique d’une table.

À la différence d’une vue standard, les données sont dupliquées. On l’utilise à des fins d’optimisation
de performance, lorsque le select associé est particulièrement complexe ou lourd, ou pour faire des
réplications de table.
La « fraicheur » des données de la VM dépend des options choisies. Le décalage entre les données de
la table maître et la VM peut être nul (rafraichissement synchrone) ou d’une durée planifiée : heure,
jour, ...
Suivant le contexte il existe différents types de vues matérialisées possibles : sur clé primaire, rowid, et
plus ou moins complexes : avec fonctions agrégées, sous requêtes, jointures, …

Il pourra être utile de faire des tests d’actualisation (complète et rapide), de bien peser les volumétries,
doser les fréquences d’actualisation en fonction des besoins réels, ...

Si l’option “réplication avancée” d’Oracle (Oracle Advanced replication option) n’est pas précisée à la
création, les VM ne pourront être utilisées qu’en lecture seule

Dès qu’un ordre SQL est très consommateur de ressources et revient relativement souvent, on peut
mettre en place une vue matérialisée avec la clause QUERY REWRITE.

Certains DBAs (Data Base Administrator) déconseillent de trop créer de vues matérialisées sur une
table, car ceci peut entraîner des pertes de performances lors des COMMIT puisququ’il doit rafraîchir
les vues matérialisées.

13
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

On peut dire que les vues matérialisées peuvent consommer beaucoup d’espace disque. Mais à l’heure
actuelle, quand on voit le coût du stockage, ça ne pose pas tellement de problèmes.

2. Syntaxe :

Syntaxe minimale :

CREATE MATERIALIZED VIEW MV1


AS SELECT * FROM nom_table

3. Exemples :

Syntaxe minimale pour la création d'une vue matérialisée sous Oracle :


CREATE MATERIALIZED VIEW MV1
AS SELECT * FROM scott.emp

Requête de création d'une vue matérialisée avec précision de la fréquence de rafraichissement


sous Oracle:
CREATE MATERIALIZED VIEW MV_UneVueMaterialisee
REFRESH FAST
START WITH SYSDATE
NEXT SYSDATE + 1
AS SELECT * FROM monSchema.MaTable;

Pour retrouver le select d'une vue matérialisée sous Oracle :


SELECT QUERY FROM ALL_MVIEWS
WHERE MVIEW_NAME='MV1'

Les Snapshots : (Les cliches en français)


1. Définition et intérêts :

Les snapshots sont utilisés pour répliquer les données depuis une source maître vers plusieurs cibles.
Les snapshots peuvent être en lecture seule ou mis à jour. Avant de créer un snapshot, il faut d’abord
créer un lien vers la base de données source.

Deux types de snapshots peuvent être crées : simples et complexes. Un snapshot simple ne contient pas
de clause distinct, group by, connect by, de jointure multi-tables ou d’opérations set.

Un REFRESH FAST utilise un snapshot log, pour actualiser le snapshot. Ce fichier se trouve sur le
même site que la table maître. Dans le snapshot log, sont stockées les modifications intervenues sur la
table maître. Ainsi, pour chaque mise à jour, seules les modifications qui sont envoyées, et non
l’ensemble des données. Par contre, un REFRESH COMPLETE est obligatoire pour les snapshots
complexes.

14
ISG Tunis 3ème LFIG
TD BD Repartie 2013/2014

Une utilisation classique des snapshots en mise à jour est le cas du contrôle technique automobile.
Tous les centres de contrôle stockent des données concernant les véhicules qu’ils ont contrôlés durant
la journée. Chaque nuit, les données sont déversées dans la base nationale qui centralise les données de
l’ensemble du parc automobile du pays. Notons que, les snapshots en mise à jour peuvent engendrer
des conflits. Un déclencheur (en anglais trigger) sauvegarde les mises à jour opérées sur le snapshot et
les transmet au site maître au moment du rafraîchissement de ce snapshot.

Pour plus d’information voir les liens suivants :

http://www.oracle.com/technetwork/articles/sql/11g-dataguard-083323.html

http://docs.oracle.com/cd/E11882_01/server.112/e16638/autostat.htm#PFGRF94188

15