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