У меня есть схема по умолчанию, отличная от dbo. Почему содержимое этой схемы не всегда используется? - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю в компании, 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? Я пропускаю настройку или мне нужно пойти и создать весь этот дополнительный контент?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ответ от Erland Sommarkskog, расположенного здесь: https://social.msdn.microsoft.com/Forums/en-US/73678fa7-0b9c-4780-ae16-197bd30aba3a/i-have-a-default-schema-that-is-not-dbo-why-is-the-content-in-that-schema-not-always-consumed?forum=sqlsecurity ответил на мой вопрос относительно этого поведения. «Когда вы находитесь внутри модуля, именно этот модуль определяет схему по умолчанию для неквалифицированных объектов, а не схему по умолчанию для текущего пользователя».

0 голосов
/ 01 ноября 2018

Правильный ответ - всегда полностью квалифицировать объекты со схемой как при их создании, так и при запросе к ним. Полагаясь на значения по умолчанию, мы просим о неприятностях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...