Skip to content

Semana de webcasts da comunidade MCITP SC: dias 06/2 a 10/2

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 😀

Diferença entre Login e Usuário

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)

Boas práticas de programação: Injeção de Dependência

“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/

Instruções INSERT, EXEC, SELECT em Procedure

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”

Detectando a fragmentação lógica de índices

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

Capturando resultados pela cláusula OUTPUT

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'

Iniciante: Alias e Atribuição

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.

http://msdn.microsoft.com/pt-br/library/ms187330.aspx