O SQL 2008 R2 cria usuário / esquema quando o usuário do Windows cria tabelas

9

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:

  1. Cria um usuário 'DOMAIN \ User1' no AppDb que usa um logon 'DOMAIN \ User1' não listado em SSMS \ Security \ Logins da instância.
  2. Cria um esquema 'DOMAIN \ User1' no AppDb.
  3. Cria essas tabelas usando o novo esquema 'DOMAIN \ User1'.

Estou completamente perplexo com esses resultados. Aqui estão as minhas perguntas:

  1. 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?
  2. Por que o servidor não cria um esquema 'DOMAIN \ AppUsers' e adiciona as novas tabelas a esse esquema se ele deseja adicionar esquemas?
  3. Além disso, como o banco de dados usa um logon não mostrado em SSMS \ Security \ Logins?
  4. 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.

duvidoso
fonte
Você pode definir o esquema padrão {dbo, por exemplo} para usuários do domínio, mas não para grupos de domínios.

Respostas:

9

Isso sempre aconteceu, de volta ao SQL Server 2000.
Sem esquema, como o SQL Server sabe que você deseja colocá-lo no dboesquema?

A única maneira de especificar um esquema padrão é:

  • use logons SQL (não Windows)
  • executar como "sysadmin"

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:

  • mesas em Data
  • outras tabelas Archive, Stagingetc
  • código em esquemas por permissões de cliente: Desktop, WebGUIetc

Usar o esquema dbo é o último milênio :-) Links:

gbn
fonte
Então, eu acho que devemos atualizar o código para prefixar novas tabelas com o esquema, certo? Isso significa que é comum que novos usuários apareçam no nó Segurança?
flipdoubt
@ flipdoubt: sim para ambos. Uma vez que você se acostuma, e usar esquemas como namespaces ou recipientes, torna-se uma segunda natureza
GBN
Uma última pergunta. Se é uma prática comum adicionar usuários automaticamente e uma prática recomendada especificar esquemas durante a criação do objeto, como você pode conceder direitos ao novo esquema antes que o usuário criado automaticamente crie um erro ao consultar um objeto no novo esquema? Usando o exemplo que eu postei sobre 'DOMAIN \ User1', posso atribuir acesso à conta 'DOMAIN \ AppUsers', mas as consultas usarão os direitos de acesso para 'DOMAIN \ User1' ou 'DOMAIN \ AppUsers'? É tão sorrateiro que o servidor cria o usuário assim que o objeto é criado.
flipdoubt
As permissões serão padronizadas para o proprietário do esquema, que é user1. Isto é como DB_OWNER para esquema
gbn 23/11
2

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.

Comunidade
fonte
Nós escrevemos o aplicativo.
flipdoubt
2

Embora a pergunta seja muito antiga e já tenha uma resposta aceita, tentarei responder suas perguntas mais especificamente (em vez de dar conselhos gerais).

  1. 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"

  2. 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.

  3. 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.

  4. 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).

Razvan Socol
fonte
0

Embora essa seja uma pergunta antiga, observei esse comportamento (no SQL Server 2014) e encontrei o seguinte:

Dado o script

USE [master]
CREATE DATABASE [Test]

USE [Test]

-- Note that we create the users without specifying the default schema
CREATE USER [MyDomain\MyADGroup] FOR LOGIN [MyDomain\MyADGroup] -- ad group
CREATE USER [MyDomain\MyDomainUser] FOR LOGIN [MyDomain\MyDomainUser] -- ad user (not in said AD group)

ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyADGroup]
ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyDomainUser]

EXECUTE AS LOGIN = 'MyDomain\MyAdGroupUser' -- a windows account which is a member of [MyDomain\MyADGroup]

CREATE TABLE Test
(
    a INT
)

REVERT 

EXECUTE AS USER = 'MyDomain\MyDomainUser'

CREATE TABLE Test
(
    a INT
)

Este script criará duas tabelas chamadas Teste.

A primeira CREATE TABLEcria uma tabela chamada [MyDomain\MyAdGroupUser].[Test]e também cria o MyDomain\MyAdGroupUseresquema (assim como um MyDomain\MyAdGroupUserusuário do banco de dados que está desativado)

o segundo CREATE TABLEcria uma tabela chamada[dbo].[Test]

A razão para isso é que, como os CREATE TABLEcomandos 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

SEarle1986
fonte