Мы добавили имя пользователя сервера и базы данных, которые сопоставляют группу Windows с экземпляром SQL 2008 R2 с помощью следующего сценария, имена которого изменены для анонимности:
USE master
go
CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
go
USE AppDb
go
CREATE USER [DOMAIN\AppUsers] FOR LOGIN
[DOMAIN\AppUsers]
go
EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers'
go
Когда учетная запись DOMAIN \ User1 входит в приложение, User1 отлично выполняет запросы к таблицам в схеме dbo, поскольку User1 является членом DOMAIN \ AppUsers, но это приложение также позволяет пользователю создавать таблицы. При создании этих таблиц без указания схемы SQL Server выполняет следующие действия:
- Создает пользователя «DOMAIN \ User1» в AppDb, который использует имя входа «DOMAIN \ User1», не указанное в SSMS \ Security \ Logins для экземпляра.
- Создает схему 'DOMAIN \ User1' в AppDb.
- Создает эти таблицы, используя новую схему DOMAIN \ User1.
Я полностью сбит с толку этими результатами. Вот мои вопросы:
- Я ожидаю, что создание таблицы не удастся, а создаст дополнительные объекты. Может кто-нибудь указать мне на ту часть Books Online, которая объясняет это?
- Почему сервер не создает схему 'DOMAIN \ AppUsers' и не добавляет новые таблицы в эту схему, если собирается добавить схемы?
- Кроме того, как база данных использует имя входа, не показанное в SSMS \ Security \ Logins?
- Если посмотреть на пользователя 'DOMAIN \ User1' в SSMS \ Databases \ AppDb \ Security \ Users, значок пользователя имеет небольшую красную стрелку, указывающую вниз. Что это обозначает?
Мы только начинаем использовать проверку подлинности Windows в организации, которая для простоты предпочла проверку подлинности SQL, поэтому я уверен, что мой вопрос заключается в том, что я не знаю о различиях. Этот код был написан задолго до того, как мы рассмотрели вопрос об использовании проверки подлинности Windows, поэтому я уверен, что нам нужно улучшить понимание создания новых схем при входе в систему с использованием проверки подлинности Windows от имени любого другого лица, кроме владельца базы данных.
В случае, если вы не можете сказать, я настаиваю на использовании проверки подлинности Windows поверх проверки подлинности SQL. Если мы не получим четкого понимания этого, мы вернемся к SQL-аутентификации.
источник
Ответы:
Это всегда происходило, начиная с SQL Server 2000.
Как SQL Server узнает, что без схемы вы хотите поместить ее в
dbo
схему?Единственный способ указать схему по умолчанию:
Ни один из них не является приемлемым
Рекомендуется всегда квалифицировать схему для каждой ссылки на объект для DDL и DML. Существуют явные преимущества в производительности благодаря повторному использованию плана.
Кроме того, преднамеренное использование схемы лучше для SQL Server 2005:
Data
Archive
иStaging
т. д.Desktop
иWebGUI
т. д.Использование схемы dbo - это последнее тысячелетие :-) Ссылки:
источник
Ну, @gbn печатает быстрее, чем я ...
Мое единственное предложение ... Вы ссылаетесь на то, что пользователь входит в приложение, и это позволяет ему создавать таблицы и тому подобное. Если приложение разрешает это, а пользователь не делает этого через сам SQL Server (вход в базу данных напрямую с помощью SSMS), вам нужно будет узнать у поставщика этого приложения.
источник
Хотя вопрос очень старый и на него уже есть принятый ответ, я постараюсь ответить на ваши вопросы более конкретно (вместо того, чтобы давать общие советы).
Поведение описано в https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql , в разделе «Неявная схема и создание пользователя».
Если вы хотите, чтобы объекты создавались в конкретной схеме (когда схема не указана явно в операторе), вы должны указать DEFAULT_SCHEMA для пользователя. В SQL Server 2008 R2 (и более ранних версиях) вы получите сообщение об ошибке, если попытаетесь назначить DEFAULT_SCHEMA пользователю на основе группы Windows, но в SQL Server 2012 (и более поздних версиях) это теперь возможно.
Он не отображается просто потому, что для этого пользователя нет логина. Как указано в https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql , пользователь может быть создан для того, кто входит в систему с использованием другой группы или даже без любой логин.
Маленькая красная стрелка (или маленькая красная буква X в более новых версиях SSMS) представляет пользователя, у которого нет разрешения CONNECT в базе данных (однако это разрешение может быть получено через другую группу).
источник
Хотя это старый вопрос, я наблюдал это поведение (в SQL Server 2014) и обнаружил следующее:
Учитывая сценарий
Этот скрипт создаст две таблицы с именем Test.
Первый
CREATE TABLE
создает таблицу с именем,[MyDomain\MyAdGroupUser].[Test]
а также создаетMyDomain\MyAdGroupUser
схему (а такжеMyDomain\MyAdGroupUser
пользователя базы данных, который отключен)вторая
CREATE TABLE
создает таблицу с именем[dbo].[Test]
Причина этого заключается в том, что, поскольку
CREATE TABLE
команды не раскрывают схему подробно, они будут использовать схему по умолчанию.Поскольку мы не указали схему по умолчанию при создании пользователей, SQL Server устанавливает схему по умолчанию для пользователя Windows как dbo, но НЕ устанавливает ЛЮБУЮ схему по умолчанию для пользователя группы Windows, и поэтому это вызывает создание схемы / пользователя.
источник