Fragmentation Oracle
-
Upload
mounir-quatra -
Category
Documents
-
view
236 -
download
4
Transcript of Fragmentation Oracle
Mise en œuvre d’une BDRCas Oracle
Création des fragments dans les bases distantes
• SQL-ANSI propose l’ordre CREATE FRAGMENT permettant de créer des tables distantes (cet ordre n’est pas encore implémenté).
• Oracle propose l’ordre COPY permettant de dupliquer un fragment d’une base vers une autre en utilisant les chaînes de connexion (connect string).
Syntaxe de la commande :
COPY FROM spécification_base1TO spécification_base2{APPEND|CREATE|REPLACE|INSERT}fragment [(Colonnes)]USING SELECT …
APPEND : [CREATE] + INSERT CREATE : CREATE + INSERT REPLACE : [DROP] + CREATE + INSERT INSERT : INSERT
Exemples de création des fragments
• Création ou replacement du fragment (fragmentation horizontale)
COPY FROM irisi /irisi @alias_base1TO irisi /irisi@alias_base2REPLACE Vehicule_VoitureUSING Select * FROM VehiculeWhere Type=‘Voiture’ ;
• Création d’un fragment (fragmentation verticale)
COPY FROM irisi / irisi @alias_base1TO irisi / irisi @alias_base2CREATE Vehicule_Infos (NumVeh, Marque, Modele)USING Select NumVeh, Marque, Modele FROM Vehicule;
Les liens inter-bases : DATABASE LINK
• Lien défini par un utilisateur pour relier deux bases:
- Il faut connaître le login et le mot de passe du compte miroir distant- Utilisation de la chaîne de connexion du serveur distant
Les liens inter-bases : DATABASE LINK
• Suppression d’un lienDROP DATABASE LINK lien_base2
• Utilisation d’un lien : Sur la base de données ‘Base1’
Select * from Vehicule@lien_base2; -- liste la table distante Vehicule
Update Vehicule@lien_base2 set Marque=‘BMW’; -- modification de la table distante Vehicule
Indépendance à la localisation
• Les synonymes :
Création d’un synonyme:CREATE SYNONYM Vehicule FOR Vehicule@lien_Base2;
Suppression d’un synonyme:DROP SYNONYM Vehicule;
Synonyme d’une séquence distante :CREATE SYNONYM Sequence_VehiculeFOR Sequence_Vehicule @lien_Base2;
Indépendance à la localisation
• Les objets virtuels :
Reconstitution d’une table fragmentée : VIEW
CREATE VIEW Vehicule (NumCli, Nom, Ville) ASSELECT NumVeh, Marque, Modele,‘Voiture’ FROM Vehicule@lien_BaseCasa UNIONSELECT NumVeh, Marque, Modele,‘Bicyclette’ FROM Client@lien_BaseRabat;
Les triggers INSTEAD OF
• Ces triggers s’appliquent sur les vues.
• Les clients connaissent les objets virtuels et exécutent les ordres du LMD.
• Les triggers INSTEAD OF prennent la main et font les mises à jour sur les fragments distants.
Les triggers INSTEAD OF• Exemple :
CREATE TRIGGER InsertVehiculeINSTEAD OF INSERT ON ClientFOR EACH ROWBEGIN
IF :NEW.Type=‘Voiture’ THENINSERT INTO vehicule.voiture@vers_BaseVoiture VALUES(:NEW.NumVeh, :NEW.Marque, :NEW.Modele) ;
ELSIF : NEW.Type =‘Bicyclette’ THEN INSERT INTO vehicule.bicyclette@vers_BaseBicyclette
VALUES(:NEW.NumVeh, :NEW.Marque, :NEW.Modele) ;ELSE RAISE_APPLICATION_ERROR (-20455,’Entrer Voiture ou Bicyclette’);END IF;
END;
Définition de contraintes
Tables temporaires :new / :old
• Lors d'une insertion, suppression ou modification Oracle utilise implicitement les tables temporaires :new et :old.
• Suite à une insertion<table> = <table> Union :new
• Suite à une suppression<table> = <table> Minus :old
• Suite à une modification<table> = <table> Minus :old Union :new
Contrainte temporelleclause CREATE TRIGGER
• spécifie comment doivent évoluer les données lors d'une mise à jour
CREATE TRIGGER trigsalBEFORE UPDATE OF salON jobFOR EACH ROWBEGIN IF (:new.sal < :old.sal) THEN raise_application_error(-20001,'Le salaire ne peut pas baisser'); END IF;END;
CREATE TABLE JOB ( no NUMERIC, sal NUMERIC)
PL/SQLstructure de bloc
• Langage structuré en blocs
DECLARE
. . .
BEGIN
. . .
END;
PL/SQLVariables et constantes
• Déclaration
DECLARE<varname> <type>;<constname> CONSTANT <type> := <value>;
• Assignation des variables<varname> := <value>;
<varname> := <expression>;
PL/SQL Curseur
• Un curseur permet de balayer les lignes d'une table
DECLARE CURSOR <cursorname> IS SELECT . . . ;BEGIN OPEN <cursorname>;
LOOP FETCH <cursorname> INTO var1, var2, . . .; EXIT WHEN <cursorname>%NOTFOUND; <traitement> END LOOP;
CLOSE <cursorname>END;
PL/SQLboucle FOR pour curseur
DECLARE CURSOR <cursorname> IS SELECT . . . ; <rowname> %ROWTYPE;
BEGIN FOR <rowname> IN <cursorname> LOOP . . . <rowname>.<attributename> . . . END LOOP;END;
PL/SQLstructure de contrôle
• Contrôle conditionnel
IF <condition> THEN
<instruction ou bloc>
END IF;
IF <condition> THEN
<instruction ou bloc>
ELSE
<instruction ou bloc>
END IF;
PL/SQLstructure de contrôle
• Contrôle itératif
FOR i IN 1..n LOOP
<traitement>
END LOOP;
PL/SQLstructure de contrôle
• Contrôle itératif
WHILE <condition> LOOP
<traitement>
END LOOP;
LOOP
<traitement>
EXIT WHEN <condition>;
END LOOP;
Contrainte ensemblisteclause CREATE TRIGGER
DROP TRIGGER moyenne_prix;CREATE TRIGGER moyenne_prix BEFORE INSERT OF Prix ON Livre FOR EACH ROW DECLARE prix_moyen number; BEGIN SELECT SOMME/NB INTO prix_moyen FROM PrixLivre; IF (prix_moyen>0) THEN IF (:new.PRIX < prix_moyen*0.7 OR :new.PRIX > prix_moyen*1.3) THEN raise_application_error(-20001,'Prix modifiant trop la
moyenne!'); END IF; IF (:new.PRIX > prix_moyen*0.7 AND :new.PRIX < prix_moyen*1.3) THEN UPDATE PrixLivre SET NB=NB+1, SOMME=SOMME+:new.PRIX; END IF; ELSE UPDATE PrixLivre SET SOMME=SOMME+:new.PRIX; END IF; END;.RUN
CREATE TABLE Livre ( noLivre NUMERIC PRIMARY KEY, prix NUMERIC(9,2))CREATE TABLE PrixLivre ( nb NUMERIC, somme NUMERIC(12,2))INSERT INTO PrixLivre VALUES (1,0);
Syntaxe Générale des Déclencheurs
CREATE [OR REPLACE] TRIGGER <trigger_name> {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF COLUMN [,COLUMN] …]} [OR {DELETE | INSERT | UPDATE [OF COLUMN [,COLUMN] …]} ] ... ON <table_name> [FOR EACH ROW] <BLOCK PL-SQL>
Il existe d'autres options, voir la documentation Oracle.