Les vues: création, insert, update, delete

Une vue est une requête sql, dont le résultat est accessible via un nom

Création, suppression d’une vue

Pour créer une vue

CREATE VIEW op_view AS SELECT   op1.id,
                            op1.cpt,
                            op1.dat,
                            op1.tiers,
                            op1.type,
                            op1.etat,
                            op1.debit,
                            op1.credit,
                            (select sum(op2.credit-op2.debit)
                                    from op as op2
                                    where op2.cpt = op1.cpt
                                    and (op2.dat < op1.dat or (op2.dat = op1.dat and op1.id <= op2.id))) as solde
                    FROM op as op1
                    ORDER BY op1.dat, op1.id;

Note

il faut noter dans cet exemple que les deux requêtes sql sont imbriquées

utilisation

select * from op_view

Pour supprimer une vue

DROP VIEW op_view

Insert, update, delete dans une vue

La vue étant une representation d’un select il n’est pas possible de faire les opérations d’insert, update ou delete.

Ces actions génère une erreur. Il est par contre possible d’intercepter ces actions sur une vue afin de réaliser d’autre action.

CREATE TABLE donnees_chaussure (
            nom_chaussure         text,     -- clé primaire
            dispo_chaussure       integer,  -- nombre de pairs disponibles
            couleur_chaussure     text,     -- couleur de lacet préférée
            long_min_chaussure    real,     -- longueur minimum du lacet
            long_max_chaussure    real,     -- longueur maximum du lacet
            unite_long_chaussure  text      -- unité de longueur
    );

    CREATE TABLE donnees_lacet (
            nom_lacet             text,     -- clé primaire
            dispo_lacet           integer,  -- nombre de pairs disponibles
            couleur_lacet         text,     -- couleur du lacet
            longueur_lacet        real,     -- longueur du lacet
            unite_lacet           text      -- unité de longueur
    );

    CREATE TABLE unite (
            nom_unite             text,     -- clé primaire
            facteur_unite         real      -- facteur pour le transformer en cm
    );
    CREATE VIEW chaussure AS
            SELECT sh.nom_chaussure,
                       sh.dispo_chaussure,
                       sh.couleur_chaussure,
                       sh.long_min_chaussure,
                       sh.long_min_chaussure * un.facteur_unite AS long_min_chaussure_cm,
                       sh.long_max_chaussure,
                       sh.long_max_chaussure * un.facteur_unite AS long_max_chaussure_cm,
                       sh.unite_long_chaussure
              FROM donnees_chaussure sh, unite un
             WHERE sh.unite_long_chaussure = un.nom_unite;

    CREATE VIEW lacet AS
            SELECT s.nom_lacet,
                       s.dispo_lacet,
                       s.couleur_lacet,
                       s.longueur_lacet,
                       s.unite_lacet,
                       s.longueur_lacet * u.facteur_unite AS longueur_lacet_cm
              FROM donnees_lacet s, unite u
             WHERE s.unite_lacet = u.nom_unite;

    CREATE VIEW chaussure_prete AS
            SELECT rsh.nom_chaussure,
                       rsh.dispo_chaussure,
                       rsl.nom_lacet,
                       rsl.dispo_lacet,
                       min(rsh.dispo, rsl.dispo_lacet) AS total_avail
              FROM chaussure rsh, lacet rsl
             WHERE rsl.couleur_lacet = rsh.couleur
               AND rsl.longueur_lacet_cm >= rsh.long_min_chaussure_cm
               AND rsl.longueur_lacet_cm <= rsh.long_max_chaussure_cm;

Pour éviter de générer des erreurs avec les actions insert, update, delete on peut ajouter les règles suivantes:

CREATE RULE chaussure_ins_protect AS ON INSERT TO chaussure
            DO INSTEAD NOTHING;
    CREATE RULE chaussure_upd_protect AS ON UPDATE TO chaussure
            DO INSTEAD NOTHING;
    CREATE RULE chaussure_del_protect AS ON DELETE TO chaussure
            DO INSTEAD NOTHING;

Si on souhaite maintenant réaliser des actions insert lors d’un insert dans une vue nous pouvons écrire la règle suivante:

CREATE RULE lacet_ins AS ON INSERT TO lacet
        DO INSTEAD
        INSERT INTO donnees_lacet VALUES (
                   NEW.nom_lacet,
                   NEW.dispo_lacet,
                   NEW.couleur_lacet,
                   NEW.longueur_lacet,
                   NEW.unite_lacet
        );