Eu tenho um procedimento armazenado que:
- verifica se existe uma tabela e, se houver, descarta-a.
- cria essa tabela novamente
- então preenche essa tabela com cerca de 30 consultas.
Quando eu (Proprietário do banco de dados) executa este processo, tudo funciona como pretendido. Quando meu colega de trabalho faz isso, que tem direitos DROP / CREATE nesse banco de dados por meio de uma função no Active Directory, várias coisas dão errado. O que confunde minha mente é esta:
A criação da tabela não tinha o dbo
esquema especificado explicitamente antes do nome. Isso resultou em uma tabela chamada domain\cowork_id.table_name_here
tabela a ser criada. Além de a tabela ser criada em seu esquema pessoal, ele agora também possui esse esquema no banco de dados (ele não existia antes da execução do proc).
O que aconteceu? Por que o SQL Server cria tabelas no esquema do usuário em vez de dbo
quando não é especificado?
fonte
Respostas:
Como regra, você deve especificar explicitamente o
dbo
esquema se desejar criar o objeto nesse esquema.Como você é
db_owner
, seu esquema padrão édbo
, portanto, não há problema quando você não especifica o esquema dbo ao criar objetos. Mas para outros usuários (Windows) não é a mesma coisa.Seus usuários são membros
Windows group
que não possuem esquema padrão. Nesse caso, o usuário correspondente e o esquema são criados quando o usuário cria qualquer objeto, está documentado aqui: CREATE SCHEMA (Transact-SQL)Para resolver o problema, atribua o
dbo
esquemadefault schema
a todos os seus grupos de usuários-Windows ou escreva-o explicitamente ao criar objetos. Sempre.fonte