De que servem os esquemas do SQL Server?

185

Não sou iniciante no uso de bancos de dados SQL e, em particular, do SQL Server. No entanto, eu fui principalmente um cara do SQL 2000 e sempre fui confundido com esquemas em 2005 ou mais. Sim, conheço a definição básica de um esquema, mas para que eles realmente são usados ​​em uma implantação típica do SQL Server?

Eu sempre usei o esquema padrão. Por que eu gostaria de criar esquemas especializados? Por que eu atribuiria algum dos esquemas internos?

EDIT: Para esclarecer, acho que estou procurando os benefícios dos esquemas. Se você só vai usá-lo como um esquema de segurança, parece que as funções de banco de dados já preencheram essa função. E usá-lo como um especificador de espaço para nome parece ter sido algo que você poderia ter feito com propriedade (dbo versus usuário, etc.).

Acho que o que estou falando é: o que Schemas faz que você não poderia fazer com proprietários e papéis? Quais são os seus benefícios específicos?

Erik Funkenbusch
fonte

Respostas:

164

Os esquemas agrupam logicamente tabelas, procedimentos e visualizações. Todos os objetos relacionados ao funcionário no employeeesquema etc.

Você também pode conceder permissões para apenas um esquema, para que os usuários possam ver apenas o esquema ao qual têm acesso e nada mais.

SQLMenace
fonte
21
A possibilidade de atribuir permissões a um esquema vale a pena da perspectiva da administração.
Hakan Winther
9
Você não poderia usar um banco de dados separado?
sam yi
7
Essa permissão de esquema soa bem no papel ... mas raramente é usada corretamente. Para mim, não vale a pena.
sam yi
3
Mas se for esse o caso, você não conseguiria o mesmo usando convenções de nomenclatura? Não estou sugerindo que NÃO haja um caso de uso para ele; é, na maioria das vezes, uma adição por subtração.
21138 Sam Yi
6
@ Ajedi32, sim ... com esquemas, você pode obter uma única confirmação atômica em um único log de transações e fazer backup de todos os seus dados de uma só vez, em comparação com dois bancos de dados que não estão sincronizados, além de combater transações distribuídas.
Matthew Whited 02/02
31

Assim como o Namespace dos códigos C #.

airbai
fonte
16
Infelizmente , no entanto, os esquemas e os namespaces do .NET não funcionam muito bem juntos de uma perspectiva do ORM ( ou seja, Entity Framework ). As tabelas no MyDatabase.MySchemaesquema não são mapeadas magicamente para classes de entidade no MyProject.MyDatabase.MySchemaespaço para nome. Também vale a pena notar que quaisquer .hacks com notação de ponto ( ) nos nomes das tabelas acabarão como sublinhados ( _) nos nomes das classes. Apenas comida para pensamentos infelizes.
precisa
2
Boa analogia para o ensino. Eu não vê-lo a ter 100% literalmente ... (essas ressalvas parecer menor na prática)
Samantha Branham
6
Pessoalmente, eu gostaria que eles fossem mais como namespaces do .NET, de modo que se possa aninhar um número arbitrário de esquemas ( como você pode com os namespaces ) para fins organizacionais. Isso, e eu gostaria que eles mapeassem melhor na EF.
precisa
Eles não são como espaços para nome em qualquer idioma que eu possa pensar.
Tanveer Badar
29

Eles também podem fornecer um tipo de proteção contra colisão de nomes para dados de plug-ins. Por exemplo, o novo recurso Change Data Capture no SQL Server 2008 coloca as tabelas que ele usa em um esquema cdc separado. Dessa forma, eles não precisam se preocupar com um conflito de nomenclatura entre uma tabela CDC e uma tabela real usada no banco de dados e, por esse motivo, podem deliberadamente ocultar os nomes das tabelas reais.

Joel Coehoorn
fonte
17

Eu sei que é um encadeamento antigo, mas eu mesmo procurei nos esquemas e acho que o seguinte poderia ser outro bom candidato para o uso do esquema:

Em um Datawarehouse, com dados provenientes de fontes diferentes, você pode usar um esquema diferente para cada fonte e, por exemplo, controlar o acesso com base nos esquemas. Também evita possíveis colisões de nomes entre as várias fontes, como outro pôster respondeu acima.

tobi18
fonte
9

Se você mantiver seu esquema discreto, poderá dimensionar um aplicativo implantando um determinado esquema em um novo servidor de banco de dados. (Isso pressupõe que você tenha um aplicativo ou sistema grande o suficiente para ter funcionalidades distintas).

Um exemplo, considere um sistema que executa o log. Todas as tabelas e SPs de log estão no esquema [log]. O log é um bom exemplo, porque é raro (se alguma vez) que outras funcionalidades do sistema se sobreponham (ou seja, junte-se a) objetos no esquema de log.

Uma dica para usar esta técnica - tenha uma cadeia de conexão diferente para cada esquema em seu aplicativo / sistema. Em seguida, implante os elementos do esquema em um novo servidor e altere sua cadeia de conexão quando precisar escalar.

Hogan
fonte
8

Eu tendem a concordar com Brent sobre este ... veja esta discussão aqui. http://www.brentozar.com/archive/2010/05/05/why-use-schemas/

Em resumo ... os esquemas não são muito úteis, exceto em casos de uso muito específicos. Torna as coisas confusas. Não os utilize se puder ajudá-lo. E tente obedecer à regra K (eep) I (t) S (implemente) S (idiota).

sam yi
fonte
2
Não acho que Brent esteja argumentando que "os esquemas são ruins", apenas que o uso de esquemas não padrão é muito mais complexo do que o uso do esquema padrão. O restante do seu somatório é preciso.
Joseph Daigle 23/07
"Se os [esquemas forem usados ​​corretamente, eles permitirão que você separe as permissões por grupos de objetos". ~ brentozar.com/archive/2010/05/why-use-schemas
LL Learner
7

Não vejo o benefício de criar alias para usuários vinculados ao Schemas. Aqui está o porquê ....

A maioria das pessoas conecta suas contas de usuário a bancos de dados por meio de funções inicialmente. Assim que você atribui um usuário ao sysadmin ou à função de banco de dados db_owner, de qualquer forma, essa conta é alias à conta de usuário "dbo" ou possui uma conta completa permissões em um banco de dados. Quando isso ocorrer, não importa como você se designe a um esquema além do esquema padrão (que tem o mesmo nome da sua conta de usuário), esses direitos dbo serão atribuídos ao objeto que você criar no usuário e no esquema. É meio inútil ..... e apenas um espaço para nome e confunde a propriedade verdadeira sobre esses objetos. Seu design ruim, se você me perguntar .... quem o projetou.

O que eles deveriam ter feito é criar "Grupos", jogar fora esquemas e funções e permitir que você agrupe grupos de grupos em qualquer combinação que desejar, e em cada nível informe ao sistema se as permissões são herdadas, negadas ou substituídas por customizadas. uns. Isso teria sido muito mais intuitivo e permitiu que os DBAs controlassem melhor quem são os verdadeiros proprietários desses objetos. No momento, está implícito na maioria dos casos que o usuário padrão do SQL Server do dbo possui esses direitos ... não o usuário.

tormentoso
fonte
7

Em uma loja da ORACLE em que trabalhei por muitos anos, os esquemas foram usados ​​para encapsular procedimentos (e pacotes) aplicados a diferentes aplicativos front-end. Um esquema 'API' diferente para cada aplicativo geralmente fazia sentido, pois os casos de uso, usuários e requisitos do sistema eram bem diferentes. Por exemplo, um esquema de 'API' era para um aplicativo de desenvolvimento / configuração apenas para ser usado pelos desenvolvedores. Outro esquema de 'API' era para acessar os dados do cliente por meio de visualizações e procedimentos (pesquisas). Outro código encapsulado de esquema da 'API' usado para sincronizar dados de desenvolvimento / configuração e cliente com um aplicativo que possui seu próprio banco de dados. Alguns desses esquemas de 'API', nos bastidores, ainda compartilham procedimentos e funções comuns entre si (por meio de outros 'COMMON'

Eu direi que não ter um esquema provavelmente não é o fim do mundo, embora possa ser muito útil. Realmente, é a falta de pacotes no SQL Server que realmente cria problemas em minha mente ... mas esse é um tópico diferente.

LL Learner
fonte
Com o Oracle, como 1 instância = 1 banco de dados = 1 licença a pagar, as pessoas usam shemas para evitar a criação de outro banco de dados e o pagamento de outra licença. No SQl Server, 1 servidor pode lidar com muitos bancos de dados.
Patrick Honorez
5

Acho que os esquemas são como muitos novos recursos (seja para o SQL Server ou qualquer outra ferramenta de software). Você precisa avaliar cuidadosamente se o benefício de adicioná-lo ao seu kit de desenvolvimento compensa a perda de simplicidade no design e na implementação.

Parece-me que os esquemas são aproximadamente equivalentes aos namespaces opcionais. Se você estiver em uma situação em que os nomes de objetos estão colidindo e a granularidade de permissões não é suficiente, aqui está uma ferramenta. (Eu estaria inclinado a dizer que pode haver problemas de design que devem ser tratados em um nível mais fundamental primeiro.)

O problema pode ser que, se houver, alguns desenvolvedores começarão a usá-lo casualmente para obter benefícios a curto prazo; e uma vez lá dentro, pode se tornar kudzu.

dkretz
fonte
3

No SQL Server 2000, os objetos criados foram vinculados a esse usuário específico, como se um usuário, digamos, Sam cria um objeto, digamos, Funcionários, essa tabela seria exibida como: Sam.Employees. E se Sam estiver saindo da empresa ou se mudando para outra área de negócios. Assim que você excluir o usuário Sam, o que aconteceria com a tabela Sam.Employees? Provavelmente, você precisaria alterar a propriedade primeiro de Sam.Employees para dbo.Employess. O esquema fornece uma solução para superar esse problema. Sam pode criar todo o seu objeto dentro de um esquema como Emp_Schema. Agora, se ele criar um objeto Employees no Emp_Schema, o objeto será referido como Emp_Schema.Employees. Mesmo se a conta do usuário Sam precisar ser excluída, o esquema não será afetado.

Tariq Awan
fonte
1
Isso não é mais verdade, pois existem duas novas versões desde 2000
Hogan
0

development - cada um de nossos desenvolvedores obtém seu próprio esquema como sandbox para jogar.

Nick Van Brunt
fonte
29
-1 É melhor dar aos desenvolvedores cópias inteiras separadas do banco de dados para brincar em sua própria máquina. Caso contrário, eles só poderiam alterar com segurança o que está dentro do esquema. Isso complica a promoção da vida e também a separação do esquema por outros motivos descritos por outras respostas.
Stephen Turner
5
Não posso falar pelo aplicativo em que você está trabalhando ... mas seu desenvolvimento deve refletir a produção o máximo possível. Ter esquemas em dev e não em prod pode ser problemático.
sam yi
0

Aqui está um bom exemplo de implementação do uso de esquemas com o SQL Server. Tivemos vários aplicativos de acesso por ms. Queríamos convertê-los em um portal de aplicativos ASP.NET. Todo aplicativo ms-access é escrito como um aplicativo para esse portal. Todo aplicativo ms-access possui suas próprias tabelas de banco de dados. Alguns deles estão relacionados, nós os colocamos no esquema dbo comum do SQL Server. O resto recebe seus próprios esquemas. Dessa forma, se quisermos saber quais tabelas pertencem a um aplicativo no portal de aplicativos ASP.NET que podem ser facilmente navegadas, visualizadas e mantidas.

Herman Van Der Blom
fonte