Modification de données par l'intermédiaire d'une vue
Vous pouvez modifier les données d'une table de base sous-jacente par l'intermédiaire d'une vue, de la même manière que vous modifiez les données d'une table à l'aide des instructions UPDATE, INSERT et DELETE ou de l'utilitaire bcp et de l'instruction BULK INSERT. Toutefois, les restrictions suivantes s'appliquent à la mise à jour des vues mais ne concernent pas les tables :
Notes
Certaines des restrictions suivantes ne s'appliquent pas aux vues partitionnées et aucune des restrictions ne concerne les mises à jour exécutées par le biais des déclencheurs INSTEAD OF. Pour plus d'informations, consultez la section « Autres options de modification des données par le biais d'une vue » plus loin dans cette rubrique.
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 modifiées dans la vue doivent faire référence directement aux données sous-jacentes se trouvant dans les colonnes des tables. Elles ne peuvent être dérivées de quelque autre façon, telle que :
d'une fonction d'agrégation (AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR et VARP) ;
d'un calcul ; la colonne ne peut pas être calculée à partir d'une expression qui utilise d'autres colonnes. Les colonnes formées à l'aide d'opérateurs définis (UNION, UNION ALL, CROSSJOIN, EXCEPT et INTERSECT) constituent un calcul et, en outre, ne peuvent pas être mises à jour.
Les colonnes en cours de modification ne peuvent pas être affectées par les clauses GROUP BY, HAVING ou DISTINCT.
TOP ne doit pas être utilisé dans l'instruction select_statement de la vue lorsque WITH CHECK OPTION est également spécifié.
Les restrictions précédentes s'appliquent à toutes les sous-requêtes de la clause FROM participant à créer la vue, tout comme elles s'appliquent aussi à la vue même. En général, SQL Server doit être en mesure de tracer sans ambiguïté les modifications depuis la définition de la vue jusqu'à une table de base. Par exemple, la vue suivante ne peut pas être mise à jour :
USE AdventureWorks2008R2;
GO
CREATE VIEW Sales.TotalSalesContacts
AS
SELECT p.LastName,
SUM(o.TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader AS o, Person.Person AS p
WHERE p.BusinessEntityID = o.CustomerID
GROUP BY LastName;
Une modification de la colonne LastName de TotalSalesContacts ne pourrait pas être acceptée, car la colonne a été affectée par une clause GROUP BY. S'il existe plusieurs instances du même nom, SQL Server ignore laquelle il convient de mettre à jour, insérer ou supprimer. De même, une tentative de modifier la colonne TotalSales de TotalSalesContacts entraînerait une erreur, car il s'agit d'une colonne dérivée d'une fonction d'agrégation. SQL Server ne peut pas tracer cette colonne directement jusqu'à sa table de base, en l'occurrence SalesOrderHeader.
Les directives supplémentaires suivantes s'appliquent :
Toutes les instructions de modification de données exécutées sur la vue doivent adhérer aux critères définis dans l'instruction SELECT qui définit la vue, si la clause WITH CHECK OPTION est utilisée dans la définition de la vue. Si vous incluez la clause WITH CHECK OPTION, les lignes ne peuvent pas être modifiées de telle façon qu'elles disparaissent de la vue. Toute tentative de modification d'une ligne pouvant entraîner cette situation est annulée et provoque l'affichage d'un message d'erreur.
Les instructions INSERT doivent spécifier des valeurs appartenant aux colonnes de la table sous-jacente qui n'autorisent pas les valeurs NULL et qui ne possèdent pas de définition DEFAULT.
Les données modifiées dans les colonnes de la table sous-jacente doivent adhérer aux restrictions relatives à ces colonnes, telles que la possibilité de valeur nulle, les contraintes, les définitions DEFAULT et ainsi de suite. Si par exemple une ligne est supprimée, toutes les contraintes FOREIGN KEY sous-jacentes de tables associées doivent toujours être respectées pour que la suppression aboutisse.
Une vue de partition distribuée (vue distante) ne peut pas être mise à jour à l'aide d'un curseur entièrement commandé par keyset. Cette restriction peut être résolue en déclarant le curseur sur les tables sous-jacentes et non sur la vue elle-même.
L'importation en bloc de données dans une vue partitionnée n'est pas prise en charge par les instructions bcp ou BULK INSERT et INSERT ... SELECT * FROM OPENROWSET(BULK...) Toutefois, vous pouvez insérer plusieurs lignes dans une vue partitionnée en utilisant l'instruction INSERT. Pour plus d'informations, consultez Exportation/Importation en bloc de données depuis/vers une vue.
Les instructions READTEXT et WRITETEXT ne peuvent pas être employées avec des colonnes de type text, ntext ou image dans une vue.
Autres options de modification des données par le biais d'une vue
Si les restrictions décrites plus haut dans cette rubrique vous empêchent de modifier des données directement par le biais d'une vue, voici quelques options à considérer :
utiliser des déclencheurs INSTEAD OF avec une logique prenant en charge les instructions INSERT, UPDATE et DELETE ; Pour plus d'informations, consultez Conception de déclencheurs INSTEAD OF.
utiliser des vues partitionnées pouvant être mises à jour qui modifient une ou plusieurs tables membres. Pour plus d'informations, consultez Création de vues partitionnées.
Pour ajouter des données par l'intermédiaire d'une vue
Pour modifier des données par l'intermédiaire d'une vue
Pour supprimer des données par l'intermédiaire d'une vue