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 .. code-block:: sql 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 .. code-block:: sql select * from op_view Pour supprimer une vue .. code-block:: sql 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. .. code-block:: sql 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: .. code-block:: sql 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: .. code-block:: sql 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 );