Как мой коллега получил свою собственную схему?

14

У меня есть хранимая процедура, которая:

  • проверяет, существует ли таблица, и если да, удаляет ее.
  • снова создает эту таблицу
  • затем заполняет эту таблицу примерно 30 запросами.

Когда я (владелец БД) запускаю этот процесс, все работает как положено. Когда это делает мой коллега, у которого есть права DROP / CREATE на эту базу данных через роль в Active Directory, происходит несколько проблем. Что меня поражает, так это:

При создании таблицы не было dboсхемы, явно указанной перед именем. Это привело к созданию таблицы с именем domain\cowork_id.table_name_heretable. Помимо этой таблицы, создаваемой в его личной схеме, он теперь также имеет эту схему в базе данных (ее не было до запуска proc).

Что произошло? Почему SQL Server создает таблицы в схемах пользователя, а не в dboтех случаях, когда это не указано?

steenbergh
источник
2
sqlblog.org/2009/10/11/…
Аарон Бертран

Ответы:

26

Как правило, вы должны явно указать dboсхему, если вы хотите создать объект в этой схеме.

Как и у вас db_owner, у вас есть схема по умолчанию dbo, поэтому нет проблем, если вы не указали схему dbo при создании объектов. Но для других (Windows) пользователей это не то же самое.

Ваши пользователи являются участниками этого Windows group, у которого нет схемы по умолчанию. В этом случае соответствующий пользователь и схема создаются, когда пользователь создает какой-либо объект, это задокументировано здесь: CREATE SCHEMA (Transact-SQL)

Неявная схема и создание пользователя

В некоторых случаях пользователь может использовать базу данных, не имея учетной записи пользователя базы данных (субъект базы данных в базе данных). Это может произойти в следующих ситуациях:

Логин имеет привилегии CONTROL SERVER.

У пользователя Windows нет отдельной учетной записи пользователя базы данных (субъект базы данных в базе данных), но он обращается к базе данных как член группы Windows, которая имеет учетную запись пользователя базы данных (субъект базы данных для группы Windows).

Когда пользователь без учетной записи пользователя базы данных создает объект без указания существующей схемы, субъект базы данных и схема по умолчанию будут автоматически созданы в базе данных для этого пользователя. Созданный участник базы данных и схема будут иметь то же имя, что и имя, которое пользователь использовал при подключении к SQL Server (имя входа для проверки подлинности SQL Server или имя пользователя Windows).

Это необходимо для того, чтобы пользователи, основанные на группах Windows, могли создавать и владеть объектами. Однако это может привести к непреднамеренному созданию схем и пользователей. Чтобы избежать неявного создания пользователей и схем, по возможности явно создавайте участников базы данных и назначайте схему по умолчанию. Или явно указывайте существующую схему при создании объектов в базе данных, используя имена объектов из двух или трех частей.

Чтобы решить эту проблему, просто назначьте dboсхему default schemaвсем группам пользователей-Windows или напишите схему явно при создании объектов. Всегда.

sepupic
источник