A Comunidade Técnica Microsoft de Santa Catarina, http://mcitpsc.com.br , inicia nessa semana uma série webcasts sobre SQL Server, com a participação de grandes “feras” nacionais e inclusive estrangeiros.
Para participar gratuitamente basta inscrever pelo site da comunidade, ou acompanhar os demais eventos da Microsoft
Bom aproveito 😀
Para sabermos a diferença entre usuários e logins no SQL Server, é importante entendermos o que são as entidades e suas hierarquias.
Entidades ou Principals – traduzida e encontrada nos livros e manuais, são os logins, usuários e roles.
Elas solicitam recursos do SQL Server e são organizadas em hierarquias:
– Windows-level,
– SQL Server-level e
– Database-level
Veja a figura abaixo:
Definições:
Os Logins são criados no nível da instância do banco de dados do servidor, já os usuários são criados no nível de banco de dados.
Podemos dizer que existe um “mapeamento” entre os logins e usuários.
Como sabemos, os logins são usados para permitir que usuários conectam aos serviços/instâncias do SQL Server.
É possível ter login sem definido criado sem ter acesso a um banco de dados.
Já o usuário é criado no banco de dados e pode ser mapeado para um login.
Este mapeamento é o que permite a pessoa conectar à instância e usar os recursos do banco de dados.
Observação:
O objetivo desse post foi em esclarecer a diferença que podem surgir quando deparamos em logins e usuários criados.
Num próximo artigo irei falar sobre os comandos de criação de logins e usuários (CREATE LOGIN, CREATE USER), e as principais views do catálogo de segurança (sys.server_principals, sys.sql_logins)
“A duplicação de código pode ser a raiz de todo o mal no software.”
..
“Código é um dos melhores (ou piores) amigos do desenvolvedor de software.”
Algumas vez ocorreu de você ficar “perdido” em um código sujo e isso causou-lhe um atraso?
Nada mais agradável quando deparamos com código limpo e fácil de entender.
Vou passar a resumir sempre que possível “Boas práticas de programação” e recomendações.
A seguir um assunto essencial:
– A Injeção de Dependência
A DI, dependency injection, é uma prática usada para resolver o problema do alto acoplamento entre diferentes módulos de um sistema, tornando seu projeto INDEPENDENTE de implementação, logo promovendo e diminuindo dependências desnecessárias entre as classes, por exemplo.
Existem muitos exemplos de códigos fontes em C#, Java, etc em diversos sites, esse é um exemplo fácil de compreender:
http://viniciusquaiato.com/blog/injecao-de-dependencia
Nesse outro um vídeo sendo uma boa recomendação para assistir:
http://www.heroisdati.com/herocast-aquele-sobre-injecao-de-dependencia-di/
Procedimentos armazenados que retornam um conjunto de resultados, podemos efetuar instruções “SELECT”
O exemplo a seguir cria um variável Tabela com os mesmos campos de retorno da Procedure.
-- criando uma Procedure simples CREATE PROCEDURE dbo.PD_SelectAllPessoa AS SELECT IdPessoa, NomePessoa FROM Pessoa GO -- declarando uma variável tabela que receberá os dados DECLARE @VarTable Table( IdPessoa int, NomePessoa varchar(80) ) INSERT @VarTable EXEC dbo.PD_SelectAllPessoa -- efetuando um SELECT SELECT * FROM @VarTable WHERE IdPessoa between 1 AND 10
Observações:
– Apesar da Microsoft dizer para “Evite processar ou retornar dados em excesso.”, é comum usar Procedures para retornar dados.
(http://msdn.microsoft.com/pt-br/library/ms187926.aspx)
– Procedimentos aninhados (quando um procedimento chama outro ou executa código gerenciado), pode ocorrer a seguinte mensagem de erro:
“An INSERT EXEC statement cannot be nested”
A fragmentação ocorre por meio de modificações de dados com as instruções INSERT, UPDATE e DELETE feitas na tabela e, portanto, nos índices definidos na tabela.
É possível identificar os índices mais fragmentados logicamente usando a sys.dm_db_index_physical_stats
Efetuando uma consulta nessa exibição, teremos a fragmentação lógica dos índices, indicando a porcentagem de entradas no índice que estão fora de ordem.
Essa fragmentação lógica afeta qualquer varredura de classificação que use um índice, recomenda-se remover a fragmentação sempre que possível, com a recompilação ou reorganização do índice.
SELECT object_name(V.object_id) as Tabela, I.name as NomeIndice, ROUND(V.avg_fragmentation_in_percent,2) as [Fragmentacao %] FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.Pessoa'), NULL, NULL, NULL) V LEFT JOIN sys.indexes I ON V.object_id = I.object_id and I.index_id = V.index_id
Fonte: http://msdn.microsoft.com/pt-br/magazine/cc135978.aspx
Instruções UPDATE, INSERT, DELETE ou MERGE que tenha uma cláusula OUTPUT, é possível recuperar informações baseadas em cada linha afetada.
Essas informações retornadas pode ser útil em aplicativos para uso em mensagens de confirmação, arquivamentos e outros requisitos.
A seguir temos um exemplo inserindo em uma variável tabela o resultado de um INSERT numa tabela que contenha um campo Identity.
DECLARE @VarTable Table(DepartmentID smallint, Name varchar(100), GroupName varchar(100) ) INSERT HumanResources.Department(Name, GroupName) OUTPUT inserted.DepartmentID, Inserted.Name, Inserted.GroupName INTO @VarTable VALUES('Service', 'Quality Assurance' ) SELECT * FROM @VarTable
O uso da tabela variável não é obrigatório.
Veja o exemplo para uma instrução DELETE com a cláusula OUTPUT
DELETE HumanResources.Department OUTPUT deleted.* WHERE Name = 'Service'
Caso seja iniciante em SQL Server, vou mostrar algumas diferenças entre Atribuição X Alias em variáveis
A partir do SQL Server 2008, podemos atribuir um valor padrão durante a declaração da variável, devido que após uma variável ser declarada, ela é inicializada como NULL.
-- Atribuindo valores na declaração Declare @VarInt Int = 10, @VarBit bit = 1, @VarDate DateTime = getdate();
Alias é um nome alternativo para substituir o nome da coluna no conjunto de resultados da consulta.
Assim como colunas, o Alias também ser dado para variáveis:
-- SELECT: definindo Alias (nomes alternativos) SELECT NomeInt = @VarInt, NomeBit = @VarBit, -- ou.. 1 AS NomeVarInt, VarInt = 10
Atribuição: uma instrução SELECT pode inicializar várias variáveis locais, conhecida como atribuição
-- SELECT: Atribuindo valores SELECT @VarInt = 20, @VarBit = 0
Observações:
Uma instrução SELECT que contém uma atribuição de variável não pode ser usada também para executar operações
típicas de recuperação de conjunto de resultados.
Apesar da Microsft recomendar que “Para atribuir variáveis, é recomendável usar SET @local_variableem vez de SELECT @local_variable.”,
uma vantagem de utilizar o SELECT é pode atribuir valores a diversas variável em um só comando, evitando vários SET.