web-dev-qa-db-fra.com

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

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!

9
Rajesh Ranjan

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

De Livres 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 la conversation), j'utiliserais toujours le préfixe Schema.

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 la fonction système comme 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 ().

11
Shanky

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 EXEC- ed et toujours utiliser 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, alors quelqu'un qui a créé sa propre fonction qui se trouvait être appelée crypt_gen_random en 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'utilisation de exec car les fonctions intégrées ne peuvent pas être appelées ainsi.

10
Martin Smith