web-dev-qa-db-fra.com

Inconvénients de "AVEC SCHEMABINDING" dans SQL Server?

J'ai une base de données contenant des centaines de tables mal nommées (CG001T, GH066L, etc.) et j'ai des vues sur chacune avec son nom "convivial" (la vue "CUSTOMERS" est "SELECT * FROM GG120T", par exemple) . Je veux ajouter "AVEC SCHEMABINDING" à mes vues afin de pouvoir bénéficier de certains des avantages qui y sont associés, comme pouvoir indexer la vue, car une poignée de vues ont des colonnes calculées qui sont coûteuses à calculer à la volée.

Y a-t-il des inconvénients à SCHEMABINDING ces vues? J'ai trouvé quelques articles qui font vaguement allusion aux inconvénients, mais ne les abordent jamais en détail. Je sais qu'une fois qu'une vue est schemabound, vous ne pouvez pas modifier quoi que ce soit qui aurait un impact sur la vue (par exemple, un type de données de colonne ou un classement) sans d'abord supprimer la vue, c'est donc un, mais à part cela? Il semble que la possibilité d'indexer la vue elle-même l'emporterait de loin sur l'inconvénient de planifier plus soigneusement vos modifications de schéma.

58
SqlRyan

Pas du tout. C'est plus sûr. nous l'utilisons partout.

27
gbn

Vous ne pourrez pas modifier/supprimer la table, sauf si vous supprimez d'abord la vue.

44
Dan S

Oh, il y a DEFINITELY DOWNSIDES à l'utilisation de SCHEMABINDING - ceux-ci viennent du fait SCHEMABINDING, surtout lorsqu'il est couplé avec des colonnes INFORMATIQUES "SERRURES" LES RELATIONS et fait quelques "changements triviaux" sacrément presque impossible.

  1. Créez une table.
  2. Créez un UDF SCHEMABOUND.
  3. Créez une colonne COMPUTED PERSISTED qui référence l'UDF.
  4. Ajoutez un INDEX sur ladite colonne.
  5. Essayez de mettre à jour l'UDF.

Bonne chance avec celui-là!

  1. L'UDF ne peut pas être supprimé ou modifié car il est SCHEMABOUND.
  2. La COLONNE ne peut pas être supprimée car elle est utilisée dans un INDEX.
  3. La COLONNE ne peut pas être modifiée car elle est INFORMATIQUE.

Eh bien, merde. Vraiment..!?! Ma journée est juste devenue un PITA. (Maintenant, des outils comme ApexSQL Diff peuvent gérer cela lorsqu'ils sont fournis avec un schéma modifié , mais le problème est ici que je ne peux même pas modifier le schéma en commencer avec!)

Je ne suis pas contre SCHEMABINDING, l'esprit (et c'est nécessaire pour un UDF dans ce cas), mais je suis contre qu'il n'y ait pas de moyen (que je peux trouver) de "désactiver temporairement" le SCHEMABINDING .

31
user2246674

Si ces tables proviennent d'une application tierce (elles sont connues pour avoir essayé de masquer leurs tables), vous provoquez et mettez à niveau l'échec s'il tente de modifier l'une de ces tables.

Il vous suffit de modifier les vues sans la liaison de schéma avant la mise à jour/mise à niveau, puis de les remettre. Comme d'autres l'ont mentionné. Prend juste un peu de planification, de discipline, etc.

4
JeffO

Un inconvénient est que si vous schemabind une vue, elle ne peut référencer que d'autres vues schemabound.

Je le sais car j'ai essayé de schemabind une vue et un message d'erreur m'a dit qu'il ne pouvait pas être schemabound car l'une des autres vues auxquelles il fait référence n'est pas également schemabound.

La seule conséquence de cela est que si vous souhaitez soudainement mettre à jour une vue schemabound pour référencer une vue nouvelle ou existante, vous devrez peut-être également schemabind cette vue nouvelle ou existante. Dans ce cas, vous ne pourrez pas mettre à jour la vue, et vous feriez mieux d'espérer que vos développeurs de bases de données savent comment travailler avec les vues schemabound.

4
Triynko

Un autre inconvénient est que vous devez utiliser des noms qualifiés de schéma pour tout: vous obtiendrez une charge de messages d'erreur comme celui-ci:

Impossible de lier le schéma vue 'vue' car le nom 'table' n'est pas valide pour la liaison de schéma. Les noms doivent être au format en deux parties et un objet ne peut pas se référencer.

De plus, pour "désactiver" la liaison de schéma, vous modifiez la vue, ce qui vous oblige à redéfinir l'instruction select de la vue. Je pense que la seule chose que vous n'avez pas à redéfinir, ce sont les subventions. Cela me décourage beaucoup car l'écrasement de la vue semble être une opération intrinsèquement dangereuse.

C'est un peu comme la façon dont l'ajout de contraintes non nulles vous oblige à écraser le type de données de la colonne - méchant!

Vous devrez également redéfinir toutes les autres vues ou procédures qui dépendent de l'objet lié au schéma que vous souhaitez modifier ... cela signifie que vous devrez peut-être redéfinir (et éventuellement casser) une grande cascade de fonctions et de vues juste pour ajouter (par exemple ) une contrainte non nulle à une colonne.

Personnellement, je pense que cela ne représente pas vraiment une solution et il vaut mieux avoir un processus décent par lequel toutes les modifications de la base de données sont appliquées automatiquement, donc ce n'est pas un cauchemar de changer la base de données. De cette façon, toutes vos vues + fonctions peuvent être supprimées et recréées à partir de zéro (elles sont quand même vérifiées lors de la création) dans le cadre du processus lorsque vous appliquez des modifications aux tables.

2
JonnyRaa

cela me semble être un inconvénient (les nôtres sont les miens):

Cannot create index on view "###.dbo.###" because it uses a LEFT, RIGHT, or FULL OUTER join, and no OUTER joins are allowed in indexed views. Consider using an INNER join instead.

J'ai un peu besoin de mes jointures GAUCHE. Cette SO question est pertinente.

1
ZagNut

Les points négatifs mentionnés ne l'emportent guère sur cette meilleure pratique depuis SQL Svr 2005. Cela évite le redoutable spouleur de table. Un inconvénient majeur pour moi est que les sprocs, les fonctions, les vues liés au schéma ne peuvent pas inclure de bases de données "étrangères" telles que la base de données principale, de sorte que vous pouvez jeter toutes les bonnes choses du système en temps réel dans la corbeille, sauf, par exemple, votre cœur de production la base de données se trouve à l'intérieur du maître. Pour moi, je ne peux pas gérer la vie sans les trucs du système. Bien sûr, tous les traitements ne nécessitent pas de performances sans spoule et les résultats rapides et lents peuvent être combinés simultanément dans les couches de classe de données supérieures.

1
thetempest

Lorsque vous utilisez tSQLt Unit Test Framework, vous rencontrerez des problèmes et aurez besoin de solutions de contournement lors de l'utilisation de la méthode FakeTable, qui ne vous permettra pas de simuler une table liée à une vue avec schemabinding.

1
Marcelo Barbieri

Si votre outil (ssms, etc.) ne gère pas bien/élégamment les échecs de changement de schéma sur l'objet de base, vous pourriez vous causer un vrai chaos. C'est avec ça que je suis assis maintenant, et je me rends compte que c'est une affaire marginale

0
Adriaan Davel