Я работаю в компании, 8 месяцев, которая поставляет программное обеспечение примерно 80 клиентам. Один из владельцев сообщил мне, что я теперь тоже администратор. Пока я не пришел сюда, мой опыт работы с SQL Server был в основном в области ETL и BI, я не против изучения, поэтому я углубляюсь. Наш базовый контент, хранимые процедуры, функции, представления и т. Д. Хранятся в схеме dbo. Когда мы создаем пользовательский контент для клиента, он помещается в схему клиента. Мы не используем обозначение схемы при использовании контента. Мне сказали, что наши клиенты обращаются к базе данных с одним пользователем, безопасность доступа обрабатывается в приложении, и у этого пользователя есть схема по умолчанию cus. Наши клиенты используют разные версии SQL Server с 2008 по 2014 год, в основном стандартные или экспресс-версии.
Моя проблема в этом. Если я сделаю для клиента изменение в базовом коде, схеме dbo и сохраню его в схеме cus, то мне нужно будет также создать объект для всего, что вызывает этот объект в стеке вызовов в схеме cus, иначе это не будет называется. Когда мне впервые сказали это, я был в порядке, что не имеет смысла, но если вы так говорите. Я думал, что если бы содержимое было в схеме по умолчанию, cus, оно было бы выполнено так, как SQL Server сначала посмотрел бы там, прежде чем искать в схеме dbo.
Теперь у меня есть возможность создать весь этот контент, и я решил проверить свою веру в то, как я думал, что SQL Server работает, и обнаружил, что то, что я считаю, правда, но только иногда. Я надеюсь, что это не одна из тех, это зависит от ситуации, и я просто не понимаю. Во всяком случае, я создал 7 очень простых функций в схеме dbo и cus, как это
СОЗДАТЬ ФУНКЦИЮ [dbo]. [Function_X] (@ Co int)
ВОЗВРАЩАЕТСЯ СТОЛ
КАК ВОЗВРАТИТЬ
(
Выберите «cus» в качестве схемы, «Function_X» в качестве забавы, @ co в качестве пройденного
объединить всех
Выберите * из Function_X_X (1)
)
Они идентичны, за исключением тех, что в схеме dbo говорят dbo, и тех, что в схеме cus говорят cus. Таким образом, я знаю, откуда они вызваны. Я действительно пытался сделать это в расширенных событиях, но не мог найти способ сделать это, но я отвлекся. Основные функции вызывают function_1, function_2, function_3 и function_4. Function_2 вызывает function_2_1 и вызывает function_2_1_1, см. Ниже.
Function
Function_1
Function_2
Function_2_1
Function_2_1_1
Function_3
Function_4
Переименовав различные функции в разных схемах, чтобы они не вызывались, я смог увидеть, какие из них выполняются в какой схеме. Результаты оказались не такими, как я ожидал.
1 Если исходная функция отсутствует в схеме Cus, то никакие функции в схеме Cus не выполняются.
2 На данный момент, игнорируя функции 2_1 и 2_1_1, когда начальная функция находится в схеме Cus, четыре функции 1-4 будут запускаться из схемы Cus, если они существуют, в противном случае они будут выполняться из dbo, поэтому я получу сочетание cus и dbo. схема в зависимости от того, какие функции существуют.
3 Если функция 2_1 не найдена в cus, то она работает в dbo, как и функция 2_1_1, даже если она существует в схеме cus.
Пример 2 выполнен как ожидалось, однако я не ожидал результатов из примера 1 или 3. Я ожидал увидеть выполнение функции cus, если она существует. В примере 1 все функции в схеме CAS были проигнорированы. В примере 3, когда function_2_1 не был найден, он запустил тот в dbo, как и ожидалось, но затем также запустил функцию 2_1_1 из dbo.
Ища повсюду в Интернете, я не мог видеть ничего, что касалось моего вопроса. Я наткнулся на пост, в котором говорилось о владельце схемы и о том, что у них есть схема по умолчанию. Владелец dbo схемы cus и схема по умолчанию SA входа в систему для владельца - dbo. Думая, что это может переопределить схему по умолчанию, я создал нового пользователя для входа на сервер и базу данных со схемой по умолчанию cus и изменил владельца схемы cus. Увы, без изменений в результате. Я вышел из системы и / или перезапустил службу, когда сделал это. Я пытался сделать это несколько раз. Я даже создал новую схему, используя новый логин, но получил тот же результат.
Есть ли способ заставить SQL Server использовать то, что находится в схеме cus? Я пропускаю настройку или мне нужно пойти и создать весь этот дополнительный контент?