Чому префікс схеми (dbo) є обов'язковим, коли ми викликаємо функцію?


9

Коли користувач відображається зі схемою за замовчуванням (dbo), і ми можемо вибрати всі таблиці під [dbo] без префіксації схеми.

Ми можемо виконувати збережені процедури без префіксу, якщо це за схемою за замовчуванням.

Враховуючи це, чому нам потрібно префіксувати функцію за допомогою схеми?

Дякую!

Відповіді:


11

Тоді чому ми можемо викликати функцію без префікса (схеми), створеного під dbo?

З Інтернет-документа Книги про АДС

Функції, що оцінюються за шкалою, можна викликати там, де використовуються скалярні вирази. Сюди входять обчислені стовпчики та визначення обмежень CHECK. Функції, що оцінюються за шкалою, можна також виконувати за допомогою оператора EXECUTE. Функції, що мають значення в масштабі, потрібно викликати, використовуючи принаймні двоскладове ім'я функції .

Таким чином, це в основному обмеження, встановлене командою з розробки SQL Server, і я вважаю це цілком правильним. Навіть якщо це якимось чином дозволено (лише заради розмови), я все одно використовував би префікс схеми.

Я завжди підтримую використання імені схеми, навіть якщо воно буде працювати без його додавання. Це найкраща практика, і всі розробники "Хороших" використовують її незалежно від того, наскільки вона зайва.

Інша причина, яку я бачу, полягає в тому, що двигуну Бази даних потрібно щось розмежувати між функціями системи, як getdate ()і визначеними користувачем функціями. Якщо вам дозволяється викликати функцію без назви схеми, як би механізм бази даних розмежував функцію, створену користувачем, на ім'я Getdate, або систему GETDATE ().


Тоді чому інакше із СП. Як ви вже говорили, можливо, уникнути зіткнення імен. Я щойно створив SP "створити процедуру sp_help як select getdate ()" у своїй базі даних користувачів, і коли я виконую схему або без неї (dbo), SQL Server звертається до системного SP. Чому він не виконує мій СП, який я створив.
Раджеш Ранджан

1
@rajeshRajan Оскільки у вас є sp_procname (ви встановили попередню процедуру з SP), це змушує SQL Server першим шукати головну базу даних для складеного плану, і оскільки ця прос існує в головній базі даних, буде виконуватися не ваш, якщо не було знайти Proc в господарі, то це виконало б ваше. Ніколи не слід створювати Proc з префіксом sp_, оскільки він має проблеми з продуктивністю.
Шанкі

Я думаю, що Шанкі відповів на питання "чому" безпосередньо, коли згадав, що його встановила команда розробників SQL Server. Ви можете запитати, чому вони це зробили і чому поведінка функцій не відповідає процедурам, але відповідь, ймовірно, не має великого значення.
Michael J Swart

1
До речі, вплив на ефективність процедур, які починаються з "sp_", неможливо виміряти. Це не було проблемою роками. Префікс sp все ще не є гарною ідеєю, але продуктивність не є причиною.
Michael J Swart

10

Інша відповідь пояснює, що це обмеження, але не причина.

Вимога не завжди відповідає дійсності. Скалярні UDF можуть бути EXEC-ed та все ще використовувати неявну роздільну здатність ( приклад )

Я думаю, що це уникнути назви колізій.

Якщо дозволено посилатися на функції без схеми, то у когось, хто створив свою власну функцію, яку було викликано crypt_gen_randomу 2000 або 2005 роках, виникли б проблеми з оновленням до більш пізньої версії, оскільки це стало назвою вбудованої функції у 2008 році.

Немає двозначності з execвикористанням вбудованих функцій не можна назвати так.


Тоді чому інакше із СП. Як ви вже говорили, можливо, уникнути зіткнення імен. Я щойно створив SP "створити процедуру sp_help як select getdate ()" у своїй базі даних користувачів, і коли я виконую схему або без неї (dbo), SQL Server звертається до системного SP. Чому він не виконує мій СП, який я створив.
Раджеш Ранджан

3
@Rajesh. Об'єкти, що починаються sp_, спеціальні, щоб завжди шукати в базі даних master / ресурсів. І задокументовано, що цього префікса слід уникати. Не існує такої умовності для вбудованих функцій.
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.