Como meu colega conseguiu seu próprio esquema?

14

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 dboesquema especificado explicitamente antes do nome. Isso resultou em uma tabela chamada domain\cowork_id.table_name_heretabela 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 dboquando não é especificado?

steenbergh
fonte
2
sqlblog.org/2009/10/11/…
Aaron Bertrand

Respostas:

26

Como regra, você deve especificar explicitamente odbo 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 groupque 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)

Esquema implícito e criação de usuário

Em alguns casos, um usuário pode usar um banco de dados sem ter uma conta de usuário (um principal de banco de dados no banco de dados). Isso pode acontecer nas seguintes situações:

Um login tem privilégios de CONTROL SERVER.

Um usuário do Windows não possui uma conta de usuário de banco de dados individual (um principal de banco de dados no banco de dados), mas acessa um banco de dados como membro de um grupo do Windows que possui uma conta de usuário de banco de dados (um principal de banco de dados para o grupo Windows).

Quando um usuário sem uma conta de usuário do banco de dados cria um objeto sem especificar um esquema existente, o principal do banco de dados e o esquema padrão serão criados automaticamente no banco de dados para esse usuário. O principal e o esquema do banco de dados criados terão o mesmo nome que o usuário usou ao se conectar ao SQL Server (o nome de login da autenticação do SQL Server ou o nome de usuário do Windows).

Esse comportamento é necessário para permitir que usuários baseados em grupos do Windows criem e possuam objetos. No entanto, pode resultar na criação não intencional de esquemas e usuários. Para evitar a criação implícita de usuários e esquemas, sempre que possível, crie explicitamente entidades de banco de dados e atribua um esquema padrão. Ou indique explicitamente um esquema existente ao criar objetos em um banco de dados, usando nomes de objetos de duas ou três partes.

Para resolver o problema, atribua o dboesquema default schemaa todos os seus grupos de usuários-Windows ou escreva-o explicitamente ao criar objetos. Sempre.

sepupico
fonte