Share via


Règles et limitations des codes de mise à jour XML (SQLXML 4.0)

Tenez compte des éléments suivants lorsque vous utilisez des codes de mise à jour (updategrams) XML :

  • Si vous utilisez un code de mise à jour (updategram) dans le cadre d'une opération d'insertion avec une paire unique de blocs <before> et <after>, le bloc <before> peut être omis. À l'inverse, lors d'une opération de suppression, c'est le bloc <after> qui risque d'être omis.

  • Si vous utilisez un code de mise à jour avec plusieurs blocs <before> et <after> dans la balise <sync>, les blocs <before> et <after> à la fois doivent être spécifiés afin de former les paires <before> et <after>.

  • Les mises à jour dans un code de mise à jour sont appliquées à la vue XML fournie avec le schéma XML. Par conséquent, pour que le mappage par défaut soit un succès, vous devez spécifier le nom du fichier de schéma dans le code de mise à jour ou, si le nom de fichier n'est pas fourni, les noms d'élément et d'attribut doivent correspondre aux noms de table et de colonne dans la base de données.

  • SQLXML 4.0 nécessite que toutes les valeurs de colonne dans un code de mise à jour soient explicitement mappées dans le schéma (XDR ou XSD) fourni pour composer la vue XML de ses éléments enfants. Ce comportement diffère des versions antérieures de SQLXML dans lesquelles la valeur d'une colonne non mappée dans le schéma était autorisée si elle appartenait implicitement à la clé étrangère dans une annotation sql:relationship. Notez que ce changement n'affecte pas la propagation des valeurs de clé primaire dans les éléments enfants qui a toujours lieu dans SQLXML 4.0 si aucune valeur n'est explicitement spécifiée pour l'élément enfant.

  • Si vous utilisez un code de mise à jour pour modifier des données dans une colonne binaire (comme le type de données SQL Server image), vous devez fournir un schéma de mappage dans lequel le type de données SQL Server (par exemple, sql:datatype="image") et le type de données XML (par exemple, dt:type="binhex" ou dt:type="binbase64) doivent être spécifiés. Les données de la colonne binaire doivent être spécifiées dans le code de mise à jour ; l'annotation sql:url-encode spécifiée dans le schéma de mappage est ignorée par le code de mise à jour.

  • Lorsque vous écrivez un schéma XSD, si la valeur que vous spécifiez pour l'annotation sql:relation ou sql:field inclut un caractère spécial, tel qu'un espace (par exemple, dans le nom de la table « Détails des commandes »), cette valeur doit apparaître entre crochets (par exemple, « [Détails des commandes] »).

  • Lors de l'utilisation de codes de mise à jour, les relations de chaîne ne sont pas prises en charge. Par exemple, si les tables A et C sont liées par une relation de chaîne qui utilise la table B, l'erreur suivante survient lorsque vous tentez d'exécuter le code de mise à jour :

    There is an inconsistency in the schema provided.
    

    Même si le schéma et le code de mise à jour à la fois apparaissent corrects et formés comme il se doit, cette erreur se produira s'il existe une relation de chaîne.

  • Les codes de mise à jour n'autorisent pas le passage de données de type image en guise de paramètres lors des mises à jour.

  • Les types de données BLOB (Binary Large Object), tels que text/ntext, et les images ne doivent pas être utilisés dans le bloc <before> lors de l'utilisation de codes de mise à jour car cela les inclura dans le contrôle d'accès concurrentiel. Cela peut entraîner des problèmes avec SQL Server en raison des limitations sur la comparaison pour les types BLOB. Par exemple, le mot clé LIKE est utilisé dans la clause WHERE pour effectuer une comparaison entre les colonnes du type de données text ; toutefois, les comparaisons échouent dans le cas de types BLOB lorsque la taille des données dépasse 8 Ko.

  • Les caractères spéciaux dans les données ntext peuvent entraîner des problèmes avec SQLXML 4.0 en raison des limitations de comparaison pour les types BLOB. Par exemple, l'utilisation de « [Serializable] » dans le bloc <before> d'un code de mise à jour, s'il est utilisé dans le contrôle d'accès concurrentiel d'une colonne de type ntext, échouera avec la description d'erreur SQLOLEDB suivante :

    Empty update, no updatable rows found   Transaction aborted
    

Voir aussi

Référence

Considérations de sécurité relatives au code de mise à jour (updategram) (SQLXML 4.0)