Je travaille sur un grand projet ETL et DW où nous utilisons le contrôle TFS / source avec SSIS et SSDT.
Aujourd'hui, j'ai découvert que pendant qu'un package SSIS effectue un BULK INSERT dans une table de base de données, il n'est pas possible d'effectuer une comparaison de schéma SSDT avec cette base de données. C'est regrettable, car certains de nos packages prennent un certain temps. Nous voulons utiliser la fonction Schema Compare pour détecter les modifications apportées à la structure de la base de données afin de les enregistrer dans notre projet SSDT pour le contrôle de version de la base de données.
En y regardant un peu plus, j'ai trouvé que la fonction de comparaison de schéma dans SSDT exécute un script SQL qui appelle la OBJECTPROPERTY()
fonction système sur les tables de la base de données. Plus précisément dans mon cas, tout appel à OBJECTPROPERTY(<object_id>, N'IsEncrypted')
semble être bloqué, lorsqu'il <object_id>
fait référence à une table en cours d'insertion en bloc.
Dans Visual Studio, la comparaison de schéma SSDT expire simplement après un certain temps et prétend qu'aucune différence n'a été détectée.
Existe-t-il une solution à ce problème dans SSDT, ou devrais-je essayer de déposer un rapport de bogue MS Connect?
Alternativement, puisque le BULK INSERT se produit à partir d'un package SSIS, existe-t-il peut-être un moyen de faire cette insertion sans verrouiller les OBJECTPROPERTY
appels sur la table? Edit: dans les destinations SSIS OLE DB, nous pouvons supprimer la coche de "Lock Table", qui fait ce qu'il dit, mais cela peut nuire aux performances dans certaines situations. Je suis beaucoup plus intéressé par une solution qui permet à la comparaison de schémas SSDT de faire son travail, même si certains objets sont verrouillés.
la source
Réponses:
L'
OBJECTPROPERTY
appel nécessite un verrou de stabilité de schéma (Sch-S), qui est uniquement incompatible avec un verrou de modification de schéma (Sch-M).Le
BULK INSERT
prendra un verrou Sch-M dans certaines circonstances. Celles-ci sont répertoriées dans la section «Verrouillage et journalisation des tables lors de l'importation en bloc» des Lignes directrices pour optimiser l'importation en bloc dans la documentation en ligne:Si la table de destination est en cluster, vous trouverez peut-être utile d' activer l' indicateur de trace 610 . Veuillez lire toute la série de ces articles et le Guide de performances de chargement de données et tester attentivement si vous décidez d'emprunter cette voie.
Je n'ai aucune idée pourquoi SSDT vérifie la
IsEncrypted
propriété des tables. Je ne peux pas imaginer un scénario où cela a du sens, mais c'est une question pour les gens SSDT.la source