Modification directe des tables via une vue SQL ?!
Bonjour à toutes et à tous !
Quelqu'un peut m'expliquer pourquoi les éditeurs de SGBDR ont du mal à permettre via une vue la modification directe des tables sous-jacentes la vue SQL ?
Je m'explique :
=> Sous SQL Server
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CREATE TABLE T_PERSONNE (id int, nom varchar(50), prenom varchar(50),email varchar(50))
CREATE VIEW V_PERSONNE (nom,prenom,email)
AS
SELECT nom,prenom,email FROM T_PERSONNE
UNION
SELECT null,null,null
INSERT INTO V_PERSONNE VALUES ('ZINZINDOHOUE','Etienne','zinzineti@yahoo.fr')
--> Résultat
/*
Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'V_PERSONNE' failed because it contains a derived or constant field.
*/ |
Le BOL MS SQL SERVER justifie clairement pourquoi je ne peux pas faire de modification sur ma vue :
Citation:
Pour modifier les données d'une table sous-jacente, vous pouvez utiliser une vue sous réserve que les conditions suivantes soient vraies :
* Toute modification, y compris celles via les instructions UPDATE, INSERT et DELETE, doivent faire référence aux colonnes d'une seule et même table de base.
* Les colonnes étant modifiées dans la vue doivent faire référence directement aux données sous-jacentes se trouvant dans les colonnes des tables. Les colonnes ne peuvent être dérivées de quelque autre façon, telle que par :
Une fonction d'agrégation : (AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR et VARP) ;
un calcul, car la colonne ne peut être calculée à partir d'une expression utilisant d'autres colonnes ; de même, les colonnes formées par le biais des opérateurs UNION, UNION ALL, CROSSJOIN, EXCEPT et INTERSECT équivalent à une somme de calculs et ne peuvent donc pas être mises à jour
et MS SQL SERVER propose une porte de sortie :
Citation:
Si les restrictions précédentes vous empêchent de modifier des données directement à travers une vue, voici quelques options à considérer pour vous aider :
Déclencheurs INSTEAD OF
Les déclencheurs INSTEAD OF peuvent être créés sur une vue pour que celle-ci puisse être mise à jour. ....
Bref MS SQL SERVER impose de passer par un trigger INSTEAD OF ... pour modifier les tables sous-jacentes d'une vue SQL. D'où ma question pourquoi MS SERVER complique la mise des tables d'une vue et impose de passer par un trigger INSTEAD OF ?
=> Sous ORACLE
Code:
1 2 3 4 5 6 7 8
| CREATE VIEW V_PERSONNE (nom,prenom,email) AS SELECT nom,prenom,email FROM T_PERSONNE UNION SELECT null,null,null FROM DUAL;
INSERT INTO V_PERSONNE VALUES ('ZINZINDOHOUE','Etienne','zinzineti@yahoo.fr');
--> Résultat
/*
ERREUR à la ligne 1 :
ORA-01732: les manipulations de données sont interdites sur cette vue
*/ |
Pareil ! impossible de mettre à jour ma table !
=> Sous PostGreSQL
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
create view V_PERSONNE (nom,prenom,email)
AS
SELECT nom,prenom,email FROM T_PERSONNE
UNION
SELECT null,null,null
INSERT INTO V_PERSONNE VALUES ('ZINZINDOHOUE','Etienne','zinzineti@yahoo.fr')
--> Résultat
/*
ERREUR: ne peut pas insérer dans la vue « v_personne »
État SQL :55000
Astuce : Vous avez besoin d'une règle ON INSERT DO INSTEAD sans condition ou d'un trigger INSTEAD OF INSERT.
*/ |
idem PostGreSQL suggère aussi l'utilisation d'un trigger !
N'est ce pas un des inconvénients de travailler avec des vues SQL ?