Les Vues et les declencheurs

Transcription

Les Vues et les declencheurs
ISG Tunis
TD BD Repartie
3ème LFIG
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
FROM
ename, job, sal, deptno
emp
1
ISG Tunis
TD BD Repartie
WHERE
3ème LFIG
2013/2014
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';
UPD
COLUMN_NAME
------------------------------ --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
TD BD Repartie
FROM
WHERE
3ème LFIG
2013/2014
emp
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';
UPD
COLUMN_NAME
------------------------------ --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
TD BD Repartie
3ème LFIG
2013/2014
(nom, metier, salaire, depart) AS
SELECT
FROM
ename, job, sal*1.33, deptno
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
FROM
WHERE
ename, job, sal, deptno
emp
deptno = 10
WITH READ ONLY;
Vue créée.
SQL> SELECT column_name, updatable
FROM user_updatable_columns
4
ISG Tunis
TD BD Repartie
3ème LFIG
2013/2014
WHERE table_name = 'LES_EMP_DEPT_10';
COLUMN_NAME
UPD
------------------------------ ---
NO
NOM
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
FROM
WHERE
ename, job, sal, deptno
emp
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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,
END;
:old.quantity,
:old.cost_per_item,
:old.total_cost,
sysdate,
v_username );
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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
TD BD Repartie
3ème LFIG
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