Adicionamos um usuário de logon e banco de dados do servidor que mapeia um Grupo do Windows para uma instância do SQL 2008 R2 usando o seguinte script, com os nomes alterados para anonimato:
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
Quando a conta DOMAIN \ User1 faz login no aplicativo, o Usuário1 consulta as tabelas no esquema dbo muito bem porque o Usuário1 é membro de DOMAIN \ AppUsers, mas esse aplicativo permite que o usuário crie tabelas também. Ao criar essas tabelas sem especificar um esquema , o SQL Server faz o seguinte:
- Cria um usuário 'DOMAIN \ User1' no AppDb que usa um logon 'DOMAIN \ User1' não listado em SSMS \ Security \ Logins da instância.
- Cria um esquema 'DOMAIN \ User1' no AppDb.
- Cria essas tabelas usando o novo esquema 'DOMAIN \ User1'.
Estou completamente perplexo com esses resultados. Aqui estão as minhas perguntas:
- Eu esperaria que a criação da tabela falhasse ao invés de criar objetos adicionais. Alguém pode me indicar a parte do Books Online que explica isso?
- Por que o servidor não cria um esquema 'DOMAIN \ AppUsers' e adiciona as novas tabelas a esse esquema se ele deseja adicionar esquemas?
- Além disso, como o banco de dados usa um logon não mostrado em SSMS \ Security \ Logins?
- Observando o usuário 'DOMAIN \ User1' em SSMS \ Databases \ AppDb \ Security \ Users, o ícone do usuário tem uma pequena seta vermelha apontando para baixo. O que isso significa?
Estamos apenas começando a usar a Autenticação do Windows em uma organização que prefere a Autenticação SQL por simplicidade, por isso estou certo de que minha pergunta vem do fato de ignorarmos as diferenças. Esse código foi escrito muito antes de considerarmos o uso da autenticação do Windows; portanto, precisamos melhorar nosso entendimento sobre a criação de novos esquemas ao fazer logon usando a autenticação do Windows como qualquer outra pessoa que não seja o proprietário do banco de dados.
Caso você não saiba, sou eu que pressiono pelo uso da autenticação do Windows pela autenticação do SQL. Se não chegarmos a um entendimento sólido disso, voltaremos à Autenticação SQL.
fonte
Respostas:
Isso sempre aconteceu, de volta ao SQL Server 2000.
Sem esquema, como o SQL Server sabe que você deseja colocá-lo no
dbo
esquema?A única maneira de especificar um esquema padrão é:
Nenhuma delas é aceitável
A melhor prática é sempre qualificar o esquema para cada referência de objeto para DDL e DML. Existem claros benefícios de desempenho devido à reutilização do plano.
Além disso, o uso deliberado do esquema é melhor para o SQL Server 2005:
Data
Archive
,Staging
etcDesktop
,WebGUI
etcUsar o esquema dbo é o último milênio :-) Links:
fonte
Bem, tipos @gbn mais rápido do que eu ...
Minha única oferta é ... Você faz referência ao usuário que está efetuando login no aplicativo e permite que ele crie tabelas e tal. Se o aplicativo estiver permitindo isso e o usuário não estiver fazendo isso através do próprio SQL Server (efetuando login diretamente no banco de dados usando SSMS), será necessário verificar com o fornecedor desse aplicativo.
fonte
Embora a pergunta seja muito antiga e já tenha uma resposta aceita, tentarei responder suas perguntas mais especificamente (em vez de dar conselhos gerais).
O comportamento está documentado em https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql , na seção "Esquema implícito e criação de usuário"
Se você deseja que os objetos sejam criados em um esquema específico (quando o esquema não for especificado explicitamente na instrução), você deve especificar o DEFAULT_SCHEMA para o usuário. No SQL Server 2008 R2 (e versões anteriores), você receberia um erro se tentar atribuir um DEFAULT_SCHEMA a um usuário com base em um grupo do Windows, mas no SQL Server 2012 (e versões posteriores) isso agora é possível.
Isso não é mostrado simplesmente porque não há login para esse usuário. Conforme especificado em https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql , um usuário pode ser criado para alguém que efetue login usando um grupo diferente ou mesmo sem qualquer login.
A pequena seta vermelha (ou o pequeno x vermelho nas versões mais recentes do SSMS) representa um usuário que não possui a permissão CONNECT no banco de dados (no entanto, essa permissão pode ser obtida por outro grupo).
fonte
Embora essa seja uma pergunta antiga, observei esse comportamento (no SQL Server 2014) e encontrei o seguinte:
Dado o script
Este script criará duas tabelas chamadas Teste.
A primeira
CREATE TABLE
cria uma tabela chamada[MyDomain\MyAdGroupUser].[Test]
e também cria oMyDomain\MyAdGroupUser
esquema (assim como umMyDomain\MyAdGroupUser
usuário do banco de dados que está desativado)o segundo
CREATE TABLE
cria uma tabela chamada[dbo].[Test]
A razão para isso é que, como os
CREATE TABLE
comandos não explicitam o esquema, eles usarão o esquema padrão.Como não especificamos o esquema padrão ao criar os usuários, o SQL Server define o esquema padrão do usuário do Windows como dbo, mas NÃO define QUALQUER esquema padrão para o usuário do Grupo Windows e, portanto, isso causa a criação do esquema / usuário
fonte