У меня есть хранимая процедура, которая:
- проверяет, существует ли таблица, и если да, удаляет ее.
- снова создает эту таблицу
- затем заполняет эту таблицу примерно 30 запросами.
Когда я (владелец БД) запускаю этот процесс, все работает как положено. Когда это делает мой коллега, у которого есть права DROP / CREATE на эту базу данных через роль в Active Directory, происходит несколько проблем. Что меня поражает, так это:
При создании таблицы не было dbo
схемы, явно указанной перед именем. Это привело к созданию таблицы с именем domain\cowork_id.table_name_here
table. Помимо этой таблицы, создаваемой в его личной схеме, он теперь также имеет эту схему в базе данных (ее не было до запуска proc).
Что произошло? Почему SQL Server создает таблицы в схемах пользователя, а не в dbo
тех случаях, когда это не указано?
sql-server
sql-server-2016
steenbergh
источник
источник
Ответы:
Как правило, вы должны явно указать
dbo
схему, если вы хотите создать объект в этой схеме.Как и у вас
db_owner
, у вас есть схема по умолчаниюdbo
, поэтому нет проблем, если вы не указали схему dbo при создании объектов. Но для других (Windows) пользователей это не то же самое.Ваши пользователи являются участниками этого
Windows group
, у которого нет схемы по умолчанию. В этом случае соответствующий пользователь и схема создаются, когда пользователь создает какой-либо объект, это задокументировано здесь: CREATE SCHEMA (Transact-SQL)Чтобы решить эту проблему, просто назначьте
dbo
схемуdefault schema
всем группам пользователей-Windows или напишите схему явно при создании объектов. Всегда.источник