Ce code est extrait du très bon cours (de M. Lalonde) suivant
Cet exemple contient un rappel sur les trigger, les shapshot, et la création d'une vue concrète via le trigger ...
DROP TABLE Skieur;
CREATE TABLE Skieur (
IdSki   INTEGER         NOT NULL,
Nom     VARCHAR2(15)    NOT NULL,
Prenom  VARCHAR2(15)    NOT NULL,
Categ   VARCHAR2(10),
CHECK (Categ IN ('0-6', '7-8', '9-10', '11-12', '13-14', '15-et-plus')),
PRIMARY KEY( IdSki )
);
 
CREATE VIEW Vue_Skieur_11_12 AS
SELECT IdSki, Nom, Prenom FROM Skieur WHERE Categ = '11-12';
CREATE TABLE Concrete_Skieur_11_12 (
IdSki  INTEGER        NOT NULL,
Nom    VARCHAR2(15)   NOT NULL,
Prenom VARCHAR2(15)   NOT NULL,
PRIMARY KEY ( IdSki ),
FOREIGN KEY (IdSki) REFERENCES Skieur (IdSki)
);
CREATE OR REPLACE TRIGGER Trig_Concrete_Skieur_11_12
AFTER INSERT OR UPDATE OR DELETE ON Skieur
FOR EACH ROW
BEGIN
    IF INSERTING THEN
      IF :new.Categ = '11-12' THEN
         INSERT INTO Concrete_Skieur_11_12 VALUES (:new.IdSki, :new.Nom, :new.Prenom);
      END IF;
    END IF;
    IF UPDATING THEN
      IF :old.Categ = '11-12' THEN
        IF :new.Categ = '11-12' THEN
           UPDATE Concrete_Skieur_11_12
           -- Il n'est pas necessaire de modifier IdSki car la contrainte referencielle empeche            -- deja toute modification de cet attribut
           SET Nom = :new.Nom, Prenom = :new.Prenom
           WHERE IdSki = :new.IdSki;
        ELSE
           DELETE FROM Concrete_Skieur_11_12 WHERE IdSki = :new.IdSki;
        END IF;
      ELSE
        IF :new.Categ = '11-12' THEN
           INSERT INTO Concrete_Skieur_11_12 VALUES (:new.IdSki, :new.Nom, :new.Prenom);
        END IF;
      END IF;
    END IF;
    IF DELETING THEN
      IF :old.Categ = '11-12' THEN
         DELETE FROM Concrete_Skieur_11_12 WHERE :old.IdSki = IdSki;
      END IF;
    END IF;
END;
.
RUN Trig_Concrete_Skieur_11_12;
CREATE SNAPSHOT Snapshot_Skieur_11_12
REFRESH COMPLETE
AS (SELECT IdSki, Nom, Prenom
    FROM Skieur
    WHERE Categ = '11-12');
Aucun commentaire:
Enregistrer un commentaire