Fragmentation Oracle

20
Mise en œuvre d’une BDR Cas Oracle

Transcript of Fragmentation Oracle

Page 1: Fragmentation Oracle

Mise en œuvre d’une BDRCas Oracle

Page 2: Fragmentation 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

Page 3: Fragmentation Oracle

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;

Page 4: Fragmentation Oracle

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

Page 5: Fragmentation Oracle

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

Page 6: Fragmentation Oracle

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;

Page 7: Fragmentation Oracle

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;

Page 8: Fragmentation Oracle

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.

Page 9: Fragmentation Oracle

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;

Page 10: Fragmentation Oracle

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

Page 11: Fragmentation Oracle

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)

Page 12: Fragmentation Oracle

PL/SQLstructure de bloc

• Langage structuré en blocs

DECLARE

. . .

BEGIN

. . .

END;

Page 13: Fragmentation Oracle

PL/SQLVariables et constantes

• Déclaration

DECLARE<varname> <type>;<constname> CONSTANT <type> := <value>;

• Assignation des variables<varname> := <value>;

<varname> := <expression>;

Page 14: Fragmentation Oracle

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;

Page 15: Fragmentation Oracle

PL/SQLboucle FOR pour curseur

DECLARE CURSOR <cursorname> IS SELECT . . . ; <rowname> %ROWTYPE;

BEGIN FOR <rowname> IN <cursorname> LOOP . . . <rowname>.<attributename> . . . END LOOP;END;

Page 16: Fragmentation Oracle

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;

Page 17: Fragmentation Oracle

PL/SQLstructure de contrôle

• Contrôle itératif

FOR i IN 1..n LOOP

<traitement>

END LOOP;

Page 18: Fragmentation Oracle

PL/SQLstructure de contrôle

• Contrôle itératif

WHILE <condition> LOOP

<traitement>

END LOOP;

LOOP

<traitement>

EXIT WHEN <condition>;

END LOOP;

Page 19: Fragmentation Oracle

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);

Page 20: Fragmentation Oracle

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.