Pourquoi le préfixe de schéma (dbo) est-il obligatoire lorsque nous appelons une fonction?


9

Lorsque l'utilisateur est mappé avec le schéma par défaut (dbo) et que nous pouvons sélectionner toutes les tables sous [dbo] sans préfixer le schéma.

Nous pouvons exécuter des procédures stockées sans préfixe si elles sont sous le schéma par défaut.

Compte tenu de cela, pourquoi avons-nous besoin de préfixer une fonction avec le schéma?

Merci!

Réponses:


11

Alors pourquoi peut-on appeler une fonction sans préfixe (schéma), créée sous dbo?

Extrait d'un livre en ligne sur les documents UDF

Les fonctions à valeur scalaire peuvent être appelées lorsque des expressions scalaires sont utilisées. Cela inclut les colonnes calculées et les définitions de contrainte CHECK. Les fonctions à valeur scalaire peuvent également être exécutées à l'aide de l'instruction EXECUTE. Les fonctions à valeur scalaire doivent être appelées en utilisant au moins le nom en deux parties de la fonction .

Il s'agit donc essentiellement d'une restriction définie par l'équipe de développement de SQL Server et je la considère tout à fait correcte. Même si cela est autorisé (juste pour le plaisir de la conversation), j'utiliserais toujours le préfixe de schéma.

Je soutiens toujours l'utilisation du nom de schéma même si cela fonctionnerait sans l'ajouter. C'est la meilleure pratique et tous les "bons" développeurs l'utilisent, quelle que soit la redondance.

L'autre raison pour laquelle je vois est que le moteur de base de données a besoin de quelque chose pour différencier les fonctions système getdate ()et les fonctions définies par l'utilisateur. Si vous êtes autorisé à appeler la fonction sans nom de schéma, comment le moteur de base de données ferait-il la différence entre la fonction créée par l'utilisateur nommée Getdate ou la fonction système GETDATE ().


Alors pourquoi c'est différent avec les SP. Comme vous l'avez dit, cela peut être pour éviter de nommer les collisions. Je viens de créer un SP "create procedure sp_help as select getdate ()" dans ma base de données utilisateur et lorsque j'exécute avec ou sans schéma (dbo), SQL Server fait référence au système SP. Pourquoi il n'exécute pas mon SP que j'ai créé.
Rajesh Ranjan

1
@rajeshRajan Puisque vous avez sp_procname (vous avez préfixé votre procédure avec SP), cela oblige SQL Server à rechercher d'abord dans la base de données master pour le plan compilé et puisque ce proc existe dans la base de données master sera exécuté pas votre, s'il ne devait pas trouver le proc en maître alors il aurait exécuté le vôtre. Vous ne devez jamais créer de proc avec le préfixe sp_ car il présente des problèmes de performances.
Shanky

Je pense que Shanky a répondu directement à la question «pourquoi» lorsqu'il a mentionné que cela avait été défini par l'équipe de développement de SQL Server. Vous pourriez vous demander pourquoi ils l'ont fait et pourquoi le comportement des fonctions est incompatible avec les procédures, mais la réponse n'a probablement pas trop d'importance.
Michael J Swart

1
BTW, l'impact sur les performances des procédures commençant par "sp_" ne peut pas être mesuré. Cela n'a pas été un problème depuis des années. Le préfixe sp n'est peut-être pas une bonne idée, mais les performances ne sont pas la raison.
Michael J Swart

10

L'autre réponse explique que c'est une restriction mais pas la raison.

Cette exigence n'est pas toujours vraie. Les FDU scalaires peuvent être EXECmodifiés et utiliser toujours une résolution implicite ( exemple )

J'imagine que c'est pour éviter de nommer les collisions.

Si les fonctions pouvaient être référencées sans schéma, une personne qui aurait créé sa propre fonction qui aurait été appelée crypt_gen_randomen 2000 ou 2005 rencontrerait des problèmes lors de la mise à niveau vers une version ultérieure car cela est devenu le nom d'une fonction intégrée en 2008.

Il n'y a aucune ambiguïté avec l' executilisation car les fonctions intégrées ne peuvent pas être appelées ainsi.


Alors pourquoi c'est différent avec les SP. Comme vous l'avez dit, cela peut être pour éviter de nommer les collisions. Je viens de créer un SP "create procedure sp_help as select getdate ()" dans ma base de données utilisateur et lorsque j'exécute avec ou sans schéma (dbo), SQL Server fait référence au système SP. Pourquoi il n'exécute pas mon SP que j'ai créé.
Rajesh Ranjan

3
@Rajesh. Les objets commençant par sp_ sont placés dans un boîtier spécial pour toujours être consultés dans la base de données master / resource. Et il est documenté que ce préfixe doit être évité. Il n'y a pas une telle convention pour les fonctions intégrées.
Martin Smith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.