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