Les inconvénients de "avec SCHEMABINDING" dans SQL Server?
j'ai une base de données avec des centaines de tables maladroitement nommées (CG001T, GH066L, etc), et j'ai des vues sur chacune avec son nom" Amical "(la vue" clients "est" SELECT * de GG120T", par exemple). Je veux ajouter "avec SCHEMABINDING" à mes vues pour que je puisse avoir certains des avantages qui y sont associés, comme pouvoir indexer la vue, puisqu'une poignée de vues ont calculé des colonnes qui sont coûteuses à calculer à la volée.
Sont il y a des inconvénients à schématiser ces vues? j'ai trouvé des articles qui font vaguement allusion aux aspects négatifs, mais ne les détaillent jamais. 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, une colonne datatype ou collation) sans d'abord laisser tomber la vue, donc c'est un, mais à part ça? Il semble que la capacité d'indexer la vue elle-même dépasserait de loin l'inconvénient de planifier vos modifications de schéma plus soigneusement.
10 réponses
vous ne serez pas en mesure de modifier/laisser tomber la table, sauf si vous laissez tomber la vue en premier.
Oh, il y a définitivement des inconvénients à L'utilisation SCHEMABINDING - ceux-ci proviennent de fait le SCHEMABINDING, surtout lorsqu'ils sont couplés avec les colonnes calculées "verrouille" les relations et rend certains "changements triviaux" darn impossible.
- créer une table.
- créer un schéma UDF.
- créer une colonne PERSISTED calculée qui fait référence à L'UDF.
- ajouter un INDEX sur ladite colonne.
- essayez de mettre à jour L'UDF.
Bonne chance avec celui-là!
- L'UDF ne peut pas être abandonné ou modifié parce qu'il est schématique.
- la colonne ne peut pas être supprimée car elle est utilisée dans un INDEX.
- la colonne ne peut pas être modifiée car elle est calculée.
Eh bien, frak. Vraiment..!?! Ma journée je viens de devenir une PITA. (Maintenant, des outils comme ApexSQL Diff peuvent gérer ce lorsqu'il est fourni avec un schéma modifié , mais le problème est ici que je ne peux même pas modifier le schéma pour commencer!)
Je ne suis pas contre le SCHEMABINDING, l'esprit (et il est nécessaire pour un UDF dans ce cas), mais je suis contre qu'il n'y ait pas un moyen (que je peux trouver) de" désactiver temporairement "le SCHEMABINDING .
si ces tables sont d'une application tierce (ils sont connus pour essayer de cacher leurs tables), vous causez et la mise à niveau à l'échec si elle tente de modifier l'une de ces tables.
vous avez juste à modifier les vues sans le schemabinding avant la mise à jour/mise à niveau et puis les remettre. Comme d'autres l'ont mentionné. Il faut juste de la planification, de la discipline, etc.
un inconvénient est que si vous schemabind une vue, il ne peut faire référence à d'autres vues schemabound.
je sais cela parce que j'ai essayé de schemabind une vue et a été rencontré avec un message d'erreur me disant qu'il ne pouvait pas être schemabound parce que l'une des autres vues auxquelles il fait référence n'est pas aussi schemabound.
la seule conséquence de ceci est que si vous voulez soudainement mettre à jour une vue schemabound pour référencer une vue nouvelle ou existante, vous pourriez avoir à schemabind ce point de vue nouveau ou existant aussi. Dans ce cas, vous ne serez pas en mesure de mettre à jour la vue, et vous feriez mieux d'espérer que vos développeurs de base de données savent comment travailler avec des vues schemabound.
un autre inconvénient est que vous devez utiliser des noms schema qualifiés pour tout: vous obtiendrez une charge de messages d'erreur comme ceci:
ne peut pas lier le schéma view 'view' parce que le nom 'table' n'est pas valide pour schéma de liaison. Les noms doivent être en deux parties et un objet ne peut pas référence elle-même.
aussi à' switch off ' schemabinding vous modifiez la vue qui vous oblige à redéfinir la déclaration select de la vue. Je pense que la seule chose que vous n'avez pas à redéfinir est des subventions. Cela me met beaucoup hors de moi, car surestimer la vue semble être une opération intrinsèquement dangereuse.
C'est un peu comme ajouter des contraintes non nulles vous oblige à écraser le type de données de la colonne - nasty!
vous devrez aussi redéfinir toutes les autres vues ou procédures qui dépendent de l'objet lié au schéma que vous voulez changer... cela signifie que vous pouvez avoir à redéfinir (et éventuellement briser) grande cascade de fonctions et de vues juste pour ajouter (eg) une contrainte non nulle à une colonne.
personnellement, je pense que cela ne représente pas vraiment une solution et il est préférable d'avoir un processus décent par lequel toutes les modifications de base de données sont appliquées automatiquement de sorte qu'il n'est pas un cauchemar de changer la base de données. De cette façon, vous pouvez avoir toutes vos vues + fonctions abandonnées et recréées à partir de zéro (ils sont vérifiés sur la création de toute façon) dans le cadre du processus lorsque vous appliquez des changements aux tables.
cela ressemble à un inconvénient pour moi (#'s 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 besoin de mes jointures à gauche. Cela DONC, la question est pertinente.
lorsque vous utilisez tSQLt Unit Test Framework, vous rencontrerez des problèmes et aurez besoin de solutions lorsque vous utilisez la méthode FakeTable, qui ne vous permettra pas de simuler une table qui est liée à une vue avec schemabinding.
les points négatifs mentionnés l'emportent à peine sur cette pratique exemplaire depuis SQL Svr 2005. Il évite la trépignation de la table. Un négatif majeur pour moi est que schema bound sprocs, funcs, views, ne peut pas inclure des bases de données "étrangères" telles que le master db, donc vous pouvez jeter tous les grands trucs de système en temps réel dans la corbeille à moins, par exemple, votre base de données de base de production se trouve à l'intérieur de master. Pour moi, Je ne peux pas gérer la vie sans les systèmes. Bien sûr, tous les traitements ne nécessitent pas sans bobine les performances et les résultats rapides et lents peuvent être combinés simultanément dans des couches de données supérieures.
si votre outil (ssms etc.) ne gère pas les échecs de changement de schéma sur l'objet de base correctement / élégamment vous pourriez vous causer un certain chaos réel. C'est ce que je fais maintenant, et je me rends compte qu'il s'agit d'une affaire marginale