#20 – Para que serve


Olá pessoal, bom dia(ou talvez boa madrugada).

Não se espante com o horário, mas neste exato momento são 02:06(duas horas e seis minutos da manhã) quinta – feira dia 12/04, ou seja, um novo dia esta começando.

É a vida de um DBA e MVP não é fácil, sei que nesta quinta terei um dia repleto de afazeres, por este e outros motivos estou aqui no meu blog para compartilhar com vocês um dos novos recursos adicionados ao Microsoft SQL Server nos últimos meses.

Logicamente a cada nova versão que a Microsoft disponibilizado do SQL Server, uma nova avalanche de conceitos, funcionalidades, comandos e diversidade de possibilidades são adicionadas ao produto, mas no post de hoje, não vou apresentar propriamente uma nova funcionalidade deste fascinante Sistema Gerenciador de Banco de Dados, ao contrário, vou destacar uma nova ferramenta adicionado ao Microsoft SQL Management Studio a partir da versão 17.5 lançada no mês de fevereiro de 2018, conhecida como Descoberta e Classificação de Dados ou Data Discovery and Classification disponível para uso a partir da versão 2008.

Talvez você já deve ter ouvido falar de algo relacionado com proteção de informações organizacionais, ou quem sabe a sigla GDPR (General Data Protection Regulation)? Falando de formas gerais, trata-se de uma regulamentação geral de proteção de dados, criada inicialmente a partir de 2016, como uma possível normatização de padrões para proteção de dados organizacionais, respeitando regulamentações mundiais.

Caso ainda não tenha conhecimento ou obtida alguma informação sobre este assunto, recomendo acessar: https://www.gdpr.associates/what-is-gdpr/

Continuando, não vou me aprofundar no conceito, normas e padrões estabelecidos pelo GDPR, mas sim quero compartilhar com vocês esta recurso existente no Management Studio, que pode justamente ser muito útil para possibilitar uma melhor organização dos seus dados, como também, estabelecer uma nova maneira de categorizar os mesmo.

Sendo assim, chegou a hora de conhecer um pouco mais sobre o post de número 20 da sessão Para que serve. Então seja bem vindo ao #20 – Para que serve – Descoberta e Classificação de Dados.


Introdução

Adicionado a partir da versão 17.5 do Management Studio, o recurso Data Discovery and Classification se estabelece com uma nova ferramenta existente internamente no produto, com objetivo de nos permitir discovering (descobrir), classifying (classificar), labeling (rotular) e reporting (relatar) os dados confidenciais em seus bancos de dados.

No qual esta capacidade de descoberta e  classificação dos chamados dados confidenciais, sejam eles relacionados as áreas de negócios, financeiros, de serviços de saúde, marketing ou produção, podem desempenhar um papel fundamental na dimensão da proteção de informações organizacionais. A adoção desta nova funcionalidade implementada no Microsoft SQL Management Studio possível de ser utilizada a partir da versão 2008 e disponível até as atuais versão, nos possibilidade adotar:

  • Padrões de privacidade de dados e aos requisitos de conformidade regulamentar, como o GDPR; e
  • Controlar o acesso, fortalecendo a segurança de bancos de dados/colunas que contêm dados altamente confidenciais.

Data Discovery and Classification apresenta um conjunto de funcionalidades internas, que representam uma coleção de parametrizações para identificação e categorização de dados, que estabelecem uma camada de proteção de informações aplicadas de forma direta e transparente em nossos bancos de dados armazenados diretamente no Microsoft SQL Server, possibilitando e objetivando a proteção dos dados, não apenas do banco de dados, como também para os seguintes elementos:

  • Discovery & recommendations (Descobertas e Recomendações) – Através do mecanismo de classificação, é realizada uma verificação no banco de dados, permitindo identificar as possíveis colunas que contenham dados elegíveis a serem considerados confidenciais.
  • Labeling (Rótulos e Identificações) – Basicamente reconhecida como uma etiqueta ou rótulo de classificação de confidencialidade que estabelecem marcas de persistência em colunas, característica que nos ajuda e diferenciar estes dados de um outro dado “considerado comum”; e
  • Visibility (Visibilidade) – Estado de classificação do banco de dados que permite ser exibido em um relatório detalhado que pode ser impresso/exportado para ser usado para fins de auditoria e conformidade, bem como para outras necessidades.

Acredito que até aqui esteja tudo tranquilo, espero que você possa estar entendendo os conceitos, para que possamos evoluir a partir de agora na prática, que também será bastante simples de ser utilizada.

Como descobrir, classificar e rotular colunas confidenciais

Vamos então conhecer de forma prática como podemos estabelecer esta forma de classificação e rotulação dos nossos dados, no qual utilizaremos o Microsoft SQL Server Management Studio, tendo como base um banco de dados muito propicio para o ano de 2018.

Pois bem, em nossa prática vamos utilizar um banco de dados denominado Fifa2018 que possui todos os dados existentes no game Fifa 2018 produzido pela EASports, jogado mundialmente nos principais consoles de videogame. Caso você queria fazer o download deste banco de dados disponível para o SQL Server 2016 ou 2017, utilize este link Fifa2018.bak (por questões de compatibilidade com a plataforma wordpress, o arquivo de backup foi renomeado, tendo em seu nome o acréscimo da extensão .doc, sendo assim, basta após realizar o download remover a respectiva extensão).

Mas antes de realizarmos a classificação de forma prática, vale ressaltar que existem dois elementos muito importantes a serem entendidos, denominados:

  1. Labels (Rótulos) – os atributos de classificação principais, são usados para definir o nível de confidencialidade dos dados armazenados na coluna; e
  2. Information Types (Tipos de informações) – Nos fornecem uma granularidade adicional para o tipo dos dados armazenados na coluna, elemento que nos permite identificar de uma maneira mais especifica cada dado contido em sua respectiva coluna.

Passo 1

Dando continuidade, seguimos em frente, agora realizando de maneira prática os processos de descoberta, classificação e rótulo dos nossos dados, posteriormente vamos gerar um relatório que nos permitirá entender de forma gráfica as categorizações atribuídas para nossos respectivos dados, para tal recomendo que você acesso seu Management Studio e conecte em sua instância, procedimento o qual eu já realizei, conforme a Figura 1 abaixo apresenta:

Figura 1 – Instância local do Microsoft SQL Server 2017 conectada.

Passo 2

Nosso próximo passo será selecionar banco de dados Fifa2018, clicando com o botão da direita, posteriormente na opção Task e por último na opção Classify Data conforme ilustra a Figura 2 a seguir:

Figura 2 – Acessando a ferramenta Classify Data existente no Management Studio.

Passo 3

Ótimo, a partir deste momento, o Management Studio acaba de abrir a ferramenta Classify Data, que nos permite realizar os procedimentos de descoberta, classificação e identificação do dados existentes nas tabelas que compõem do banco de dados Fifa2018, conforme apresenta a Figura 3 abaixo:

Figura 3 – Data Classification disponível para classificação dos dados.

Analisando a Figura 3 apresentada acima, podemos observar que em sua barra de status é exibida uma mensagem informando que existem 5 colunas neste base dados que possivelmente podem ser reconhecidas como colunas de dados confidencias.

Você pode estar se perguntando como esta ferramenta realiza este tipo de análise, a resposta é bem simples, neste caso, a análise foi realizada tendo com base as simulações que eu executei justamente para poder escrever este post, por padrão ao ser inicializada pela primeira em um determinado banco de dados a Classify Data não possui informações suficientes para descobrir estas possíveis colunas.

Passo 4

Legal, o próximo passo será muito simples e tranquilo, para poder realizar a classificação dos dados, vamos clicar no botão Add Classification, existente barra de ferramentas.

Ao clicar no botão Add Classification, será apresentada uma nova ribbon chamada Data Classification ao lado direita da sua tela, a qual permitirá que você realiza das respectivas categorizações dos seus dados, de acordo com a tabela, coluna, tipo da informação e rótulo de importância ou sensibilidade do dado (Sensitivity Label), conforme apresenta a Figura 4:

Figura 4 – Barra de Ferramenta – Botão Add Classification e Ribbon – Data Classification.

De posse desta ribbon, você poderá criar suas respectivas classificações de dados, para tentar de ajudar e padronizar nossa prática, a Figura 5 a seguir ilustra o conjunto de classificação dos dados que eu realizei que podem servir como base para que você estabeleça em seu ambiente as respectivas classificações:

Figura 5 – Data Classification realizada.

Importante: Analisando a Figura 5, podemos notar a utilização de cinco colunas diferentes em nossa prática, todas existentes na tabela PlayerAllData, além disso, a coluna Sensitivity Label apresenta rótulos de sensibilidade diferentes para cada coluna, o que nos permite justamente identificar a existência de diversos rótulos, sendo este, um elemento importante para vai nos permitir ou não mostrar este dado em determinados procedimentos aos quais nosso banco de dados venha a ser envolvido.

Passo 5

Muito bem, você conseguiu, agora vamos avançar mais um pouco, já estamos quase no final, nosso próximo e extremamente importante passo consiste em salvar este conjunto de classificação de dados realizado anteriormente, para isso, nada mais claro e óbvio que clicar no botão Save “salvar” existente na barra de ferramentas da Classify Data, sendo assim, mãos no mouse e clique no botão Save.

Após realizar o procedimento de salvar, temos a partir de agora um conjunto de classificação e rotulamento de dados definido em nosso ambiente, o que nos permite realizar análise do nível se importância, confidencialidade e sensibilidade dos dados aqui definidos de acordo com nossas regras de negócio.

Passo 6

Nosso último passo esta relacionado com a capacidade de análise que esta nova ferramenta Classify Data nos permite fazer, tendo a disponibilidade de gerar um relatório contendo as informações referentes ao conjunto de classificação de dados que nós definimos no Passo 4, com isso, possibilitando estabelecer uma possível análise para posterior tomada de decisão no que se relacionada as colunas selecionadas como possíveis dados confidenciais ou dados organizacionais.

Para realizar este passo, vamos clicar no botão View Report (Exibir Relatório), procedimento que realizará o processamento e apresentação do relatório criado pelo Classify Data contendo o conjunto de informações relacionadas a nossa classificação de dados, conforme apresenta a Figura 6 abaixo:

Figura 6 – Data Classification Report – Relatório de Classificação de Dados.

Pronto, ai esta nosso relatório, simples, rápido e prático, nosso conjunto de classificação de dados apresentado, nos permitindo entender de forma gráfica os procedimentos de descoberta, classificação e rotulagem de dados.

Com isso chegamos ao final do post de número 20 da sessão Para que serve. Gostou?

Vale a verdade este post foi fácil, tranquilo? Não é mesmo!


Referências

https://docs.microsoft.com/pt-br/sql/relational-databases/security/sql-data-discovery-and-classification

https://docs.microsoft.com/en-us/sql/relational-databases/security/sql-data-discovery-and-classification

https://docs.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking

https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine

Links

Caso você ainda não tenha acessado os posts anteriores desta sessão, fique tranquilo é fácil e rápido, basta selecionar um dos links apresentados a seguir:

https://pedrogalvaojunior.wordpress.com/2018/01/02/19-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/12/15/18-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/11/24/17-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/10/01/16-para-que-serve/

Conclusão

Estamos vivendo um mundo cada vez mais tecnológico, conectado, rápido, evolutivo e muito agressivo no que se diz respeito ao valor de uma informação para nós usuário e principalmente para empresas.

Atender justamente a este conjunto de exigência diárias, satisfazendo também os órgãos mundiais em suas definições, normas e obrigações acabam exigindo de qualquer empresa um constante acompanhamento e cumprimento de deveres. Desta forma, a Microsoft esta se adequando uma nova realidade e preocupação que cresce a cada dia, como proteger de forma mundial os dados e futuras informações geradas a todo os momentos por cada um dos indivíduos e organizações existentes em nosso planeta, sabendo da importância de se respeitar as leis, normas e padrões organizacionais e governamentais.

Neste post, você conheceu pouco sobre como o Microsoft SQL Server esta preparado para atender estas leis, através da nova ferramenta adicionada internamente no Management Studio, chamada de Data Discovery and Classification, na qual nos permite através do recurso Classify Data estabelecer a classificação dos nossos dados armazenados em cada coluna existente em um banco de dados, e não somente isso, definir o nível de importância deste dado, como também, a sensibilidade do mesmo para ser apresentado ou envolvido em algum tipo de procedimento de acesso ou manipulação, visando garantir e fortalecer que esta dado deve ser tratado de forma diferenciada em comparação com um possível “dado comum”.

Sem dúvida uma grande ferramenta adicionada ao Microsoft SQL Server, que mostra o quanto a Microsoft e seus respectivos times de produto estão envolvidos preocupados em atender e respeitar todas as possíveis leis, normas e regras.

Agradecimentos

Mais uma vez obrigado por sua ilustre visita, sinto-me honrado com sua presença, espero que este conteúdo possa lhe ajudar e ser útil em suas atividades profissionais e acadêmicas.

Um forte abraço, até o próximo post da sessão Para que serve…..

Boa noite e uma ótima quinta – feira.

Até mais.

 

 

 

Anúncios

Dica do Mês – Utilizando a Trace Flag 9292 para exibir objetos estatísticos úteis


 

Olá comunidade, boa tarde.

Tudo bem? Estamos se aproximando dos últimos dias de férias ou recesso para grande maioria dos professores e profissionais de educação espalhados por todo Brasil. E ai, já esta preparado para voltar a luta? Posso dizer tranquilamente que sim, eu estou pronto para voltar a conviver com meus alunos e amigos de trabalho.

Antes de começarmos a falar sobre o post de hoje, nada mais justo começar agradecendo como de costume a você está aqui neste momento acessando meu blog. Espero que possa ter encontrado o que precisa, bem como, esteja gostando do conteúdo publicado, fique a vontade para entrar em contato expressando suas opiniões e demais pensamentos.

Neste novo post da sessão Dica do Mês, vou apresentar um recurso que imagino ser conhecido por muitos ou principalmente pelos profissionais de banco de dados, estou me referindo as Trace Flag ou sinalizador de rastreamento em português.

Você já ouvir falar sobre isso ou já utilizou? Eu imagino que sim pois aqui no meu blog diversos posts e artigos foram publicado ao longo dos últimos anos sobre este tipo de recurso. Hoje mais especificamente vou destacar o uso da Trace Flag 9292, por acaso você já utilizou em algum momento esta trace flag?

Bom independente da sua reposta vamos conhecer um pouco mais sobre ela, sua forma de uso e como poderá nos ajudar a entender ainda mais o funcionamento das estatísticas e seus chamados objetos úteis para análise do plano de execução.

E ai esta curioso para saber um pouco sobre este recurso? Eu estou, sendo assim, vamos em frente, seja bem vindo ao post Dica do Mês – Utilizando a Trace Flag 9292 para exibir objetos estatísticos úteis.

Vamos em frente…..


Introdução

Todos sabemos que as estatísticas desempenham um papel muito importante dentro do SQL Server, como também, sabemos que as estatísticas são usadas pelo otimizador de consultas para gerar o plano de execução para cada consulta.
Então a questão é, podemos verificar qual objeto estatístico é útil para a execução da consulta? Sim, usando o Trace Flag do SQL Server 9292. Este é um do sinalizador de rastreamento que pode ser usado durante a solução de problemas.
Esse sinalizador de rastreamento é usado para obter o relatório sobre objetos de estatísticas considerados como “interessantes” ou “úteis” pelo otimizador de consulta durante a compilação ou recompilação de consulta.

Adicionada ao Microsoft SQL Server 2008 após a instalação do service pack 1 e mantida até as atuais versões, no momento em tomamos a decisão de utilizar a Trace Flag 9292, orientamos o SQL Server a apresentar todos os objetos estatísticos considerados úteis por parte do plano de execução para realizar o processamento e retorno dos dados.

O uso da Trace Flag 9292 dentro de uma sessão ou query específica, nos ajuda a entender e conhecer como as estatísticas e seus elementos podem mudar totalmente a maneira que o plano de execução é idealizado, armazenado e processado.

Através dela podemos obter um relatório sobre as estatíticas para cada objeto envolvido em nossa query, onde estes supostos objetos devem ser considerados úteis, ou melhor dizendo válidos e aplicáveis no decorrer do caminho realizado até a apresentação do resultado.

Esta é uma trace flag que pode ser usada durante a resolução de problemas, onde sua função é apresentar na guia de mensagens do Management Studio, um pequeno cabeçalho contendo informações estatísticas sobre cada componente útil e válido para formas os dados estatísticos de processamento da query. Este cabeçalho é conhecido como Stats header loaded.

Para ativar a trace flag utilize o comando DBCC TraceON (9292) ou DBCC TraceOFF (9292) para desativar, ou se preferir utilize a opção QueryTraceOn em sua respectiva query.

Agora que já conhecemos um pouco mais sobre os conceitos desta trace flag, chegou a hora de colocar as mãos no teclado e conhecer melhor o funcionamento da flag 9292 e de que forma ela poderá impactar o trabalho do Microsoft SQL Server, nos permitindo identificar os objetos úteis processados ou candidatos a processamento por parte do Query Processor em conjunto com Execution Plan.

Preparando o ambiente

Nosso ambiente será bastante simples, basicamente criaremos um banco de dados denominado DBTrace9292, constituído de uma tabela denominada TBTrace9292, para tal utilizaremos o Bloco de Código 1 que apresenta a criação dos respectivos objetos:

— Bloco de Código 1 —
— Criando o Banco de Dados DBTrace9292 —
Create Database DBTrace9292
Go

— Acessando —
Use DBTrace9292
Go

— Criando a Tabela TBTrace9292 —
Create Table TBTrace9292
(Codigo Int Identity(1,1) Primary Key,
Valores Int,
Descricao Varchar(100))
Go

Após a criação dos objetos básicos, nosso próximo passo será a criação de índice nonclustered para coluna Valores que nos permitirá fazer o uso de estatísticas de processamento para esta coluna durante o processo de inserção de dados, conforme apresenta o Bloco de Código 2 apresentado abaixo:

— Bloco de Código 2 —
— Criando o Índice NonClustered IND_TBTrace9292Valores —
Create NonClustered Index IND_TBTrace9292Valores on TBTrace9292(Valores)
Go

— Inserindo uma linha de registro na Tabela TBTrace9292 —
Insert Into TBTrace9292
Values(2000,’pedrogalvaojunior.wordpress.com’)
Go

— Inserindo 1.000 linhas de registros na Tabela TBTrace9292 —
Insert Into TBTrace9292
Values(4000,’pedrogalvaojunior.wordpress.com’)
Go 1000

Note que existir uma pequena mais importante diferença entre os dois Inserts, no primeiro estamos inserindo uma linha de registro na tabela TBTrace9292. No segundo criamos em tempo de execução um pequeno bloco de inserção de linhas, sendo este processado 1.000 vezes, inserindo então 1.000 linhas.

Seguindo em frente, o Bloco de Código 3 será utilizado para criarmos uma Stored Procedure denominada P_PesquisarValores como forma para buscar os respectivos registros armazenados na tabela TBTrace9292. A seguir apresento o Bloco de Código 3:

— Bloco de Código 3 –
— Criando a Stored Procedure P_PesquisarValores —
Create Procedure P_PesquisarValores @Valor int
As
Begin
Select Descricao from TBTrace9292
Where Valores = @Valor
OPTION (RECOMPILE)
End
Go

Se você for como eu, normalmente gosto de fazer uma análise de código antes de colocar em prática no meu ambiente, sendo assim, vamos lá. Analisando de forma superficial a Stored Procedure P_PesquisarValores a princípio não apresenta nada muito especial ou de grande complexidade em seu código, mas sim o uso de opção Recompile que justamente vai orientar o plano de execução a recompilar a  P_PesquisarValores no momento da sua execução, forçando assim que a cada execução um novo plano de execução seja criado em conjunto com uma nova análise estatística e seus demais elementos.

O próximo passo consiste na pesquisa de um dos valores armazenados na tabela TBTrace9292 através da execução e processamento da Stored Procedure P_PesquisarValores. Para este passo vamos utilizar o Bloco de Código 4 a seguir, antes de sua execução recomendo habilitar a apresentação do Plano de Execução Atual no SQL Server Management Studio através do botão Include Actual Execution Plan ou simplesmente através da tecla de atalho CTRL+M.

— Bloco de Código 4 —
— Habilitando as TraceFlags 9292 e 3604 —
DBCC TraceOn(9292,3604,-1)
Go

Dica: Utilize o comando DBCC TraceStatus WITH NO_INFOMSGS para verificar quais Trace Flags estão habilitadas em qual nível de escopo.

— Execuntando a Stored Procedure P_PesquisarValores —
Exec P_PesquisarValores 4000
Go

Pois bem, após a execução do Bloco de Código 4, o Microsoft SQL Server realizou o processamento da nossa Stored Procedure P_PesquisarValores realizando uma busca de todas as linhas de registros que possuem o valor 4.000, onde obrigatoriamente foram retornadas 1.000 linhas de registros.

Até ai nada de novo ou surpreende, o que justamente eu quero mostrar para vocês é o que o Management Studio apresenta na guia Messages após o processamento do Bloco de Código 4, conforme apresenta a Figura 1 abaixo:

Note que o cabeçalho retornado pela Trace Flag 9292 conhecido como Stats header loaded esta apresentando os objetos realmente utilizados para o processamento de nossa query, bem como, os objetos considerados úteis e necessários para criação, compilação e processamento do plano de execução envolvidos na execução, sendo eles:

  • Database: DBTrace9292;
  • Table: TBTrace9292,
  • Index: IND_TBTrace9292Valores, sendo este do tipo Nonclustered;
  • Column: Valores; e
  • EmptyTable: False, representa que a tabela possui linhas de registro.

Perfeito, perfeito, ai esta a prova que a Trace Flag 9292 nos permite identificar de forma simples, coerente e muito intuitiva todos os objetos envolvidos na execução de uma query, stored procedure ou demais elementos que permitem a criação de um plano de execução.

Desta forma, chegamos ao final de mais um post, tendo a sensação de dever cumprido, espero que você tenha gostado, como sempre o Microsoft SQL Server nos surpreende com a sua capacidade e potencialidade de recursos.


Referências

https://thomaslarock.com/2016/06/sql-server-Trace-flags/

https://pedrogalvaojunior.wordpress.com/2016/02/26/02-para-que-serve/

DBCC TRACEOFF (Transact-SQL)

DBCC TRACEON (Transact-SQL)

DBCC TRACESTATUS (Transact-SQL)

EXECUTE (Transact-SQL)

Query Hints (Transact-SQL)

Post Anteriores

https://pedrogalvaojunior.wordpress.com/2017/05/23/conhecendo-e-aplicando-o-uso-de-atualizacao-de-estatisticas-incrementais/

https://pedrogalvaojunior.wordpress.com/2017/04/13/dica-do-mes-microsoft-sql-server-identificando-as-transacoes-que-estao-utilizando-o-transact-log/

https://pedrogalvaojunior.wordpress.com/2017/03/01/dica-do-mes-microsoft-sql-server-2016-sp1-novo-argumento-use-hint-disponivel-para-query-hints/

https://pedrogalvaojunior.wordpress.com/2017/01/16/dica-do-mes-conhecendo-a-nova-dmf-sys-dm_exec_input_buffer-no-microsoft-sql-server-2016/

https://pedrogalvaojunior.wordpress.com/2016/11/28/dica-do-mes-sql-server-2016-sp1-comando-create-or-alter/

https://pedrogalvaojunior.wordpress.com/2016/10/24/dica-do-mes-sql-server-2016-obtendo-informacoes-sobre-o-cache-de-execucao-de-funcoes/

Conclusão

Muitas vezes temos dificuldade em entender como um determinado recurso ou funcionalidade esta sendo utilizada pelo Microsoft SQL Server, com também, de que maneira este elemento poderá impactar nosso ambiente.

Neste post foi possível apresentar como a Trace Flag 9292 nos permite identificar quais objetos estão sendo utilizando durante o processamento e execução de uma determinada query. Um recurso de fácil configuração tanto para ser ativado como também desativado a qualquer momento ou necessidade.

Recomendo que você realize diversos testes e validações antes de fazer qualquer tipo de uso de uma trace flag em seu ambiente de produção, isso também se aplica a Trace Flag 9292.

Agradecimentos

Mais uma vez obrigado por sua visita, agradeço sua atenção, fique a vontade para enviar suas críticas, sugestões, observações e comentários.

Um forte abraço, nos encontramos em breve com mais um post da sessão Dica do Mês.

Valeu….

Short Scripts – Março 2017


Hoje é sexta – feira, sexta – feira…

Salve, salve comunidade e amantes de bancos de dados e SQL Server, Tudo bem? Mais uma final de semana próximo após uma longa semana de muito trabalho, se eu for falar de muito trabalho, sinceramente  esta semana foi complicada, repleta de novidades e muita troca de conhecimento.

Conforme o prometido no final de 2016, estou retornando com o primeiro post da sessão Short Scripts, sessão criada a alguns anos no meu blog que lentamente esta conseguindo ajudar diversos profissionais da área de banco de dados na busca por exemplos de códigos que possam solucionar ou elucidar na resolução de um determinado problema.

O post de hoje

Como já destaquei acima, este é o primeiro post de 2017 dedicado exclusivamente a sessão Short Scripts, na relação de scritps selecionados para hoje, você vai poder encontrar códigos relacionados com os seguintes assuntos:

  • Auditoria,
  • Comando Intersect,
  • Comando OpenQuery,
  • Comando Order By,
  • Datatype Char,
  • Datatype Int,
  • DMF Sys.dm_exec_sessions,
  • DMV Sys.system_internals_partitions,
  • DMV Sys.system_internals_allocation_units,
  • Função Substring,
  • Índices,
  • Informações sobre conexão de usuário,
  • Páginas de Dados,
  • Trigger, e
  • Variáveis.

Então mãos no teclado, a seguir apresento os códigos e exemplos selecionados para o Short Script – Março 2017. Vale ressaltar que todos os scripts publicados nesta sessão são devidamente testados antes de serem publicados, mas isso não significa que você pode fazer uso dos mesmo em seu ambiente de produção, vale sim todo cuidado possível para evitar maiores problemas. Fique a vontade para compartilhar, comentar, melhorar cada um destes códigos.

Short Scripts

— Short Script 1 – Realizando Auditoria in Live —

SELECT [Spid] = session_Id
, ecid
, [Database] = DB_NAME(sp.dbid)
, [User] = nt_username
, [Status] = er.status
, [Wait] = wait_type
, [Individual Query] = SUBSTRING (qt.text,
er.statement_start_offset/2,
(CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE er.statement_end_offset END –
er.statement_start_offset)/2)
,[Parent Query] = qt.text
, Program = program_name
, Hostname
, nt_domain
, start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50              — Ignore system spids.
AND session_Id NOT IN (@@SPID)     — Ignore this current statement.
ORDER BY 1, 2
Go

— Short Script 2 – Utilizando comando Intersect com Datatypes Char e Int —

Create Table #A (x Char(2));
Go
Insert Into #A Values (‘1’);
Insert Into #A Values (‘6’);
Insert Into #A Values (‘2’);
Insert Into #A Values (‘3’);
Insert Into #A Values (‘5’);
Insert Into #A Values (‘5’);
Insert Into #A Values (‘6’);
Insert Into #A Values (‘9’);
Go
Create Table #B (M BigInt);
Go
Insert Into #B Values(5);
Insert Into #B Values(5);
Insert Into #B Values(6);
Insert Into #B Values(7);
Insert Into #B Values(7);
Go
— (Select #1)
SELECT x AS ‘Select #1’ FROM #A
INTERSECT SELECT M FROM #B
Go
— (Select #2)
SELECT DISTINCT(x) AS ‘Select #2’
FROM #A LEFT OUTER JOIN #B
ON #A.x = #B.M
Go
— (Select #3)
SELECT DISTINCT(x) AS ‘Select #3’
FROM #A LEFT OUTER JOIN #B
ON #A.x = #B.M
Go
— (Select #4)
SELECT DISTINCT(x) AS ‘Select #4’
FROM #A INNER JOIN #B
ON #A.x = #B.M
Go
— (Select #5)
SELECT x AS ‘Select #5’
FROM #A INNER JOIN #B
ON #A.x = #B.M
Go
— Short Script 3 – Utilizando comando OpenQuery com variáveis —
— Valores Básicos —
DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT  @VAR = ‘teste’
SELECT  @TSQL = ‘SELECT * FROM OPENQUERY(MeuLinkedServer,”SELECT * FROM MinhaTabela WHERE User = ””’ + @VAR + ”””’)’
EXEC (@TSQL)
Go
— Query Complexa —
DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = ‘MyLinkedServer’
SET @OPENQUERY = ‘SELECT * FROM OPENQUERY(‘+ @LinkedServer + ‘,”’
SET @TSQL = ‘SELECT au_lname, au_id FROM pubs..authors”)’
EXEC (@OPENQUERY+@TSQL)
— Use o Sp_executesql procedimento armazenado —
DECLARE @VAR char(2)
SELECT  @VAR = ‘CA’
EXEC MyLinkedServer.master.dbo.sp_executesql
N’SELECT * FROM pubs.dbo.authors WHERE state = @state’,
N’@state char(2)’,
@VAR
Go
— Short Script 4 – Realizando order by com base na função SubString —
Declare @Tabela Table
(Codigo VarChar(15))
Insert Into @Tabela Values(‘191-XXX-003’)
Insert Into @Tabela Values(‘192-XXX-003’)
Insert Into @Tabela Values(‘193-XXX-003’)
Insert Into @Tabela Values(‘194-XXX-003’)
Insert Into @Tabela Values(‘195-XXX-003’)
Insert Into @Tabela Values(‘191-XXX-001’)
Insert Into @Tabela Values(‘192-XXX-001’)
Insert Into @Tabela Values(‘193-XXX-001’)
Insert Into @Tabela Values(‘194-XXX-001’)
Insert Into @Tabela Values(‘195-XXX-001’)
Insert Into @Tabela Values(‘191-XXX-002’)
Insert Into @Tabela Values(‘192-XXX-002’)
Insert Into @Tabela Values(‘193-XXX-002’)
Insert Into @Tabela Values(‘194-XXX-002’)
Insert Into @Tabela Values(‘195-XXX-002’)
Select * from @Tabela
Order By SubString(codigo,Len(Codigo)-2,3) Asc
Go
— Short Script 5 – Monitorando querys em execução —
SELECT
DES.SESSION_ID,
DES.CPU_TIME,
DES.READS,
DES.WRITES,
DES.LOGICAL_READS,
DES.ROW_COUNT,
DER.SESSION_ID,
DES.STATUS,
DES.HOST_NAME,
DES.PROGRAM_NAME,
DES.LOGIN_NAME,
DES.ORIGINAL_LOGIN_NAME,
DEC.CLIENT_NET_ADDRESS,
DEC.AUTH_SCHEME,
DEC.NET_TRANSPORT,
SUBSTRING(T.[TEXT], DER.[STATEMENT_START_OFFSET] / 2,
COALESCE(NULLIF(DER.[STATEMENT_END_OFFSET], – 1) / 2, 2147483647)) AS COMANDO
FROM
SYS.DM_EXEC_SESSIONS AS DES
INNER JOIN SYS.DM_EXEC_REQUESTS DER
ON DER.BLOCKING_SESSION_ID = DES.SESSION_ID
INNER JOIN SYS.DM_EXEC_CONNECTIONS DEC
ON DEC.SESSION_ID = DES.SESSION_ID
INNER JOIN SYS.DM_EXEC_REQUESTS DER2
ON DER2.SESSION_ID = DES.SESSION_ID
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(DER.[SQL_HANDLE]) AS T
GO
— Short Script 6 – Identificando tabelas e suas respectivas páginas de dados —
— Exemplo 1: —
SELECT P.partition_id,
OBJECT_NAME(P.object_id) As ObjectName,
U.allocation_unit_id,
SU.First_Page,
SU.Root_Page,
SU.First_IAM_Page
From Sys.Partitions As P INNER JOIN Sys.Allocation_Units As U
ON P.hobt_id = U.container_id
Inner Join Sys.system_internals_allocation_units SU
On u.allocation_unit_id = su.allocation_unit_id
Go
— Exemplo 2: —
SELECT SIP.partition_id,
OBJECT_NAME(SIP.object_id) As ObjectName,
sip.rows,
SU.First_Page,
SU.Root_Page,
SU.First_IAM_Page
From Sys.system_internals_partitions As SIP Inner Join Sys.system_internals_allocation_units SU
On sip.partition_id = su.allocation_unit_id
Go
— Short Script 7 – Identificando índices com Escrita Excessiva —
— Quantidade de Índices com Escrita Excessiva em comparação a leitura —
SELECT  OBJECT_NAME(s.object_id),
i.name,
i.type_desc
FROM    sys.dm_db_index_usage_stats s WITH ( NOLOCK ) Inner JOIN sys.indexes i WITH (NOLOCK)
ON s.index_id = i.index_id
AND s.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1
AND s.database_id = DB_ID()
AND s.user_updates > ( s.user_seeks + s.user_scans + s.user_lookups )
AND s.index_id > 1
Go
— Quantidade de Índices com Escrita Excessiva —
SELECT  COUNT(*)
FROM    sys.dm_db_index_usage_stats s WITH ( NOLOCK )
WHERE   OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1
AND s.database_id = DB_ID()
AND s.user_updates > ( s.user_seeks + s.user_scans + s.user_lookups )
AND s.index_id > 1
Go
— Short Script 8 – Identificando o espaço ocupado por conexões em uso —
SELECT A.session_id,
B.host_name, B.Login_Name ,
(user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128 as TotalalocadoMB,
D.Text
FROM sys.dm_db_session_space_usage A Inner JOIN sys.dm_exec_sessions B
ON A.session_id = B.session_id
Inner JOIN sys.dm_exec_connections C
ON C.session_id = B.session_id
CROSS APPLY sys.dm_exec_sql_text(C.most_recent_sql_handle) As D
WHERE A.session_id > 50
and (user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128 > 100 — Ocupam mais de 100 MB
ORDER BY totalalocadoMB desc
COMPUTE sum((user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128)
Go
— Short Script 9 – Obtendo a diferença de datas entre registro anterior e o próximo registro —
Create Table Datas
(ID Int Identity(1,1),
DataInicio Date,
DataFinal Date)
Go
Insert Into Datas Values (GETDATE(), GETDATE()+30)
Insert Into Datas Values (GETDATE()+1, GETDATE()+20)
Insert Into Datas Values (GETDATE()+2, GETDATE()+10)
Insert Into Datas Values (GETDATE(), GETDATE()+5)
Go
— Exemplo 1 —
Select I.ID, I.DataInicio, F.DataFinal,
DateDiff(D, I.DataInicio, F.DataFinal) As Intervalo
From Datas I Left Join Datas F
On I.ID = F.ID + 1

Go

— Exemplo 2 —
SELECT
[current].Id,
[current].Time CurrentValue,
[next].Time          NextValue
FROM #temp AS [current] LEFT JOIN #temp AS [next]
ON [next].Id = (SELECT MIN(Id) FROM #temp

                                 WHERE Id > [current].Id)
Go
— Short Script 10 – Criando um trigger condicional —
–Criando a Table de Novos Produtos–
Create Table NovosProdutos
(Codigo Int Identity(1,1),
Descricao VarChar(10))
–Criando a Table de Histórico Novos Produtos–
Create Table HistoricoNovosProdutos
(Codigo Int,
Descricao VarChar(10))
Go
–Inserindo valores —
Insert Into Novosprodutos Values(‘Arroz’)
Insert Into Novosprodutos Values(‘Arroz1’)
Insert Into Novosprodutos Values(‘Arroz2’)
Insert Into Novosprodutos Values(‘Arroz3’)
Go
–Criando a Trigger para controle de histórico–
Create TRIGGER T_Historico
ON NovosProdutos
for update
AS
IF (Select Descricao from Inserted) <> (Select Descricao from Deleted)
BEGIN
INSERT Into HistoricoNovosProdutos (Codigo, Descricao)
SELECT Codigo, Descricao FROM INSERTED
END
Go
–Fazendo os teste —
Update NovosProdutos
Set Descricao=’Arroz 4′
Where Codigo = 1
Go
Update NovosProdutos
Set Descricao=’Arroz1′
Where Codigo = 2
Go
Select * from NovosProdutos
Go

Muito bem, mais uma relação de short scripts acaba de ser compartilhada, mesmo sendo denominados short entre aspas “pequenos”, posso garantir que todos estes exemplos são de grande importância e apresentam um valor e conhecimento do mais alto nível.


Chegamos ao final de mais um Short Scripts, espero que este material possa lhe ajudar, ilustrando o uso de alguns recursos e funcionalidades do Microsoft SQL Server.

Acredito que você tenha observado que estes códigos são bastante conhecidos em meu blog, todos estão relacionados aos posts dedicados ao Microsoft SQL Server publicados no decorrer dos últimos anos.

Boa parte deste material é fruto de um trabalho dedicado exclusivamente a colaboração com a comunidade, visando sempre encontrar algo que possa ser a solução de um determinado problema, bem como, a demonstração de como se pode fazer uso de um determinado recurso.

Links

Caso você queira acessar os últimos posts desta sessão, não perca tempo acesse os links listados abaixo:

Agradecimento

Mais uma vez obrigado por sua visita, um forte abraço…

Nos encontramos em breve nos próximos posts desta e outras sessões do meu blog, valeu.

Microsoft SQL Server Migration Assistant v7.3


A Microsoft disponibilizou para download o Microsoft SQL Server Migration Assistant v7.3. Disponível para MySQL, Sybase, Oracle Database, IBM DB2 e Access, o Microsoft SQL Server Migration Assistant é uma ferramenta gratuita que simplifica o processo de migração destes produtos para o SQL Server e Azure SQL.

A ferramenta automatiza todos os aspectos da migração. A versão 7.3 inclui o suporte para:

– Migração do MySQL 4.1 e posteriores para todas as edições do SQL Server 2008, SQL Server 2008 R2, SQL Server 2012, SQL Server 2014, SQL Server 2016 e Azure SQL DB.

– Migração do Access 97 e posteriores para todas as edições do SQL Server 2012, SQL Server 2014, SQL Server 2016 e Azure SQL DB.

– Migração do Sybase ASE 11.9 e posteriores para todas as edições do SQL Server 2008, SQL Server 2008 R2, SQL Server 2012, SQL Server 2014, SQL Server 2016 e Azure SQL DB.

– Migração do Oracle Database 9.07.3 e posteriores para todas as edições do SQL Server 2008, SQL Server 2008 R2, SQL Server 2012, SQL Server 2014, SQL Server 2016 e Azure SQL DB.

– Migração do IBM DB2 9.0 e 10.0 no z/OS e das versões 9.8 e 10.1 no Linux/Unix/Windows para o SQL Server 2012, SQL Server 2014, SQL Server 2016 e Azure SQL DB.

Nota: A versão 7.3 também traz suporte preliminar para o SQL Server vNext CTP para Windows e Linux.

Microsoft SQL Server Migration Assistant v7.3

Baixe o Microsoft SQL Server Migration Assistant v7.3

Download da versão 7.3 para MySQL
Download da versão 7.3 para Sybase
Download da versão 7.3 para Oracle Database
Download da versão 7.3 para Access
Download da versão 7.3 para IBM DB2

O Microsoft SQL Server Migration Assistant v7.3 é compatível com o Windows 10 , Windows 7, Windows 8, Windows 8.1, Windows Server 2008 R2, Windows Server 2012 e Windows Server 2012 R2. Ele também requer o .NET Framework 4.0 ou posterior.

As páginas de download também listam alguns requisitos específicos, como MySQL Connector/ODBC v5.1 e Sybase OLEDB/ADO.Net/ODBC provider.

Fontes e Direitos Autorais: Baboo.com –

Material – Apoio – Especial – Apresentações – Conteúdo Técnico


Pessoal, boa tarde.

Tudo bem?

Revisando o meu Baú de Apresentações e Conteúdos Técnicos que possuo no meus Backups, encontrei bastante coisa legal que pode servir para todos os amantes de Tecnologias da Microsoft, dentre eles:

  • Windows Azure;
  • Hyper-V;
  • SQL Azure;
  • Reporting Services;
  • SQL Server 2008 R2;
  • SQL Server 2012;
  • SQL Server 2014; e
  • Windows Server 2012

Vale ressaltar que boa parte de material é resultado de Apresentações que eu realizei nos últimos anos, como também, de Apresentações Oficiais compartilhadas pela própria Microsoft.

Segue abaixo a relação de arquivos, fique a vontade para realizar o download e compartilhar.

Conhecendo o Microsoft SQL Server 2012

Microsoft Business Intelligence

Microsoft SQL Server – Simulando Fragmentação de Dados e Índices

SQL Server 2012 – Conhecendo o Microsoft SQL Server 2012 – ColumnStore Index

SQL Server 2012 – Trabalhando com Alta Disponibilidade, Cluster, Hyper-V 2012 e SQL Server 2012

SQL Server 2014 Faster Insights from Any Data Level 300 Deck

SQL Server 2014 Mission Critical Performance Level 300 Deck

SQL Server 2014 Platform for Hybrid Cloud Level 300 Deck

SQL Sever 2012 – Migração e Vantagens das tecnologias mais recentes Windows Server 2012 – Além da Nuvem

Windows Server 2012 – Estilo Moderno

Windows Server 2012 – O poder de muitos Servidores – Simplicade de um só

Windows Server 2012 – Todas as Aplicações – Qualquer Nuvem

Azure – Business Continuity Solutions in Microsoft SQL Azure

Azure – Experience the World’s Data with the Data Market on the Windows Azure Marketplace

Azure – Microsoft SQL Azure Reporting

Azure – SQL Azure Recorded Demos Azure – Tips and Tricks for Microsoft SQL Azure Federations – How to Build Cross-Federation Queries and…

SQL Server 2008 R2 – Abandonando a sysprocesses – Bem-vindo às DMV’s

SQL Server 2008 R2 – Recursos de Gerenciamento de SQL Server

SQL Server 2008 R2 – Utilizando a claúsula Output no SQL Server 2008 e R2

Você deve ter observado que alguns arquivos são referentes ao novo Microsoft SQL Server 2014, conteúdo recente e totalmente atualizado.

Mais uma vez obrigado por sua visita, espero e tenho certeza que este material será de grande avalia.

Até mais.

Utilizando a Ferramenta Surface Area Configuration no Microsoft SQL Server 2008 R2 através de Política de Gerenciamento.

Hoje gostaria de destacar para vocês uma das maiores funcionalidades adicionados ao Microsoft SQL Server, conhecida como Surface Area Configuration, presente desde a versão 2005, mas que na versão 2008 acabou sendo integrada a uma nova funcionalidade denominada Política de Gerenciamento ou Policy Management.


Olá pessoal, tudo bem com vocês?

Hoje gostaria de destacar para vocês uma das maiores funcionalidades adicionados ao Microsoft SQL Server, conhecida como Surface Area Configuration, presente desde a versão 2005, mas que na versão 2008 acabou sendo integrada a uma nova funcionalidade denominada Política de Gerenciamento ou Policy Management.

Presente no Microsoft SQL Server 2005, a Surface Area Configuration, foi introduzida como uma ferramenta que permitia ao administrador visualizar e gerenciar o estado de inicialização dos serviços instalados no Microsoft SQL Server 2005, independente da quantidade de instâncias instaladas.

Administrando servidores com Gerenciamento Baseado em Políticas

A partir do Microsoft SQL Server 2008, a Microsoft introduziu um novo conceito de gerenciamento e administração de recursos e funcionalidades de instâncias SQL Server, através do próprio Management Studio, como também, utilizando o Policy Management, sendo este, composto por um conjunto de configurações de políticas de segurança para tornar ainda mais segura o processo de administração de qualquer Servidor Microsoft SQL Server.

Gerenciamento Baseado em Políticas é um sistema para gerenciar uma ou mais instâncias do SQL Server 2008. Quando os administradores de políticas do SQL Server usam o Gerenciamento Baseado em Políticas, eles usam o SQL Server Management Studio para criar políticas para gerenciar entidades no servidor, como as instâncias do SQL Server, bancos de dados ou outros objetos do SQL Server.

O Gerenciamento Baseado em Políticas tem três componentes:

  • Gerenciamento de política: Os administradores de políticas criam políticas.
  • Administração explícita: Os administradores selecionam um ou mais destinos gerenciados e verificam explicitamente se eles estão de acordo com uma política específica, ou explicitamente fazem com que os destinos estejam de acordo com uma política.
  • Modos de avaliação: Há quatro modos de avaliação, três dos quais podem ser automatizados:
  1.                                                                i.      Sob demanda. Este modo avalia a política quando especificado diretamente pelo usuário.
  2.                                                              ii.      Ao alterar: impedir. Esse modo automatizado usa gatilhos DDL para impedir violações de política.
  1.                                                           iii.      Ao alterar: log apenas. Este modo automatizado usa a notificação de eventos para avaliar uma política quando uma alteração relevante é feita.

 

  1.                                                            iv.      Ao agendar. Este modo automatizado usa um trabalho do SQL Server Agent para avaliar periodicamente uma política.

Foi a partir deste novo contexto que o Surface Area Configuration deixou de ser utilizado como uma ferramenta externa e passou a ser integrado a este novo ambiente, mas de forma discreta e praticamente desconhecida por boa parte dos profissionais.

A meu ver um ponto falho em que a Microsoft subestimou o conhecimento e uso desta ferramenta por parte dos profissionais, conhecedores, especialistas e amantes do Microsoft SQL Server. Mas independente de qualquer opinião, esta ferramenta ainda esta presente, o que nos fortalece a possibilidade de fazermos uso de seus recursos.

Termos e conceitos do Gerenciamento Baseado em Políticas

  • Destino gerenciado pelo Gerenciamento Baseado em Políticas: As entidades gerenciadas pelo Gerenciamento Baseado em Políticas, como uma instância do Mecanismo de banco de dados do SQL Server, um banco de dados, uma tabela ou um índice. Todos os destinos em uma instância de servidor formam uma hierarquia de destino. Um conjunto de destino é aquele resultante da aplicação de um conjunto de filtros de destino à hierarquia de destino.
  • Faceta do Gerenciamento Baseado em Políticas: Um conjunto de propriedades lógicas que modelam o comportamento ou as características de certos tipos de destinos gerenciados. O número e as características das propriedades são incorporados à faceta e só podem ser adicionados ou removidos pelo criador da faceta. Um tipo de destino pode programar uma ou mais facetas de gerenciamento, e uma faceta de gerenciamento pode ser implementada por um ou mais tipos de destino. Algumas propriedades de uma faceta só podem ser aplicadas a uma versão específica. Por exemplo, a propriedade Database Mail da faceta Configuração da Área da Superfície só se aplica ao SQL Server 2005 e versões posteriores.
  • Condição de Gerenciamento Baseado em Políticas: Uma expressão booleana que especifica um conjunto de estados permitidos de um destino gerenciado pelo Gerenciamento Baseado em Políticas em relação a uma faceta de gerenciamento.
  • Política de Gerenciamento Baseado em Políticas: Uma condição do Gerenciamento Baseado em Políticas e o comportamento esperado, como, por exemplo, modo de avaliação, filtros de destino e agenda. Uma política só pode conter uma condição. As políticas podem ser habilitadas ou desabilitadas.
  • Categoria de política do Gerenciamento Baseado em Políticas: Uma categoria definida pelo usuário para ajudar a gerenciar políticas. Os usuários podem classificar as políticas em categorias diferentes. Uma política pertence a somente uma categoria. Categorias de políticas se aplicam a bancos de dados e servidores. No nível de banco de dados, as seguintes condições se aplicam:
  • Os proprietários de banco de dados podem assinar um conjunto de categorias de política para um banco de dados.
  • Somente as políticas das categorias assinadas podem governar um banco de dados.
  • Todos os bancos de dados assinam implicitamente a categoria de política padrão.

No nível de servidor, é possível aplicar categorias de políticas a todos os bancos de dados.

Política efetiva: As políticas efetivas de um destino são aquelas que governam esse destino. Uma política só será efetiva em relação a um destino se todas as seguintes condições forem satisfeitas:

  • A política está habilitada.
  • O destino pertence ao conjunto de destino da política.
  • O destino ou um dos destinos ancestrais assina o grupo de políticas que contém essa política.

Bom, após este pequeno overview sobre o Policy Management, seus termos, conceitos e formas de administração, vou destacar um pouco de como o Surface Area Configuration é definido no Microsoft SQL Server 2008 R2.

Compreendendo o Surface Area Configuration

Na configuração padrão de novas instalações do SQL Server, muitos recursos não estão habilitados. O SQL Server instala de forma seletiva e inicia somente os principais serviços e recursos, para minimizar o número de recursos que podem ser atacados por um usuário mal-intencionado.

Um administrador de sistema pode alterar esses padrões no momento da instalação e também seletivamente habilitar ou desabilitar recursos de uma instância em execução do SQL Server. Além disso, alguns componentes podem não estar disponíveis ao estabelecer conexão a partir de outros computadores até que os protocolos sejam configurados.

Importante destacar, que ao contrário das novas instalações, nenhum serviço ou recurso existente é desativado durante uma atualização, mas as opções adicionais de configuração da área da superfície poderão ser aplicadas após a conclusão da atualização.

Utilizando o Surface Area Configuration de forma básica

Para trabalharmos com o Surface Area Configuration no Management Studio é bastante simples, seguindo os passos apresentados abaixo:

A habilitação e desabilitação de recursos do SQL Server podem ser configuradas usando as facetas no SQL Server Management Studio. Para configurar área da superfície usando as facetas:

  1. No Management Studio, conecte-se a sua instância do SQL Server.
  2. No Pesquisador de Objetos, clique com o botão direito do mouse no servidor e clique em Facetas, conforme apresenta a Figura 1.

Figura 1 – Opção Facetas no Management Studio.

3. Na caixa de diálogo Exibir Facetas, expanda a lista Faceta e selecione a faceta Configuração da área da superfície apropriada, conforme apresenta a Figura 2. Por padrão estas facetas estão definidas em três categorias:

    1. Configuração       da área da superfície;
    2. Configuração       da área da superfície para o Analysis Services; e
    3. Configuração da área da superfície para o Reporting Services.

Figura 2 – Tela de Configuração das Facetas de acordo com a categoria selecionada.

A seguir apresenta somente as opções disponíveis para faceta Surface Area Configuration, conforme ilustra a Figura 3:

Figura 3 – Relação de Opções disponíveis para faceta Surface Area Configuration.

  1. Na área Propriedades da faceta, selecione os valores desejados para cada propriedade. Ou se preferir selecione, por exemplo, a Faceta DatabaseMailEnabled.
  2. Clique em OK.

Pronto, desta forma simples acabamos de realizar a ativação de uma faceta no Microsoft SQL Server 2008 R2, que posteriormente estará sendo refletido no comportamento e configuração de sua instância.

Algo que pode parecer muito similar a utilização da System Stored Procedure SP_Configure, quando estamos se referindo a configuração de recursos específicos do nosso servidor como no procedimento que realizamos anteriormente, executando o processo de ativação do Database Mail, que pode ser feito de ambas as formas, tanto por SP_Configure, como também por configuração de Facetas em Nível de Servidor.

Combinando o uso do Surface Area Configuration com a SP_Configure

Como destacado anteriormente a configuração de algumas facetas disponíveis através do Policy Management, com base no Surface Area Configuration pode ser comparado e até mesmo utilizado como alternativa á System Stored Procedure SP_Configure.

Pois bem, por procurar destacar como podemos através de cada um destes recursos fazer uso de funcionalidades do Microsoft SQL Server 2008 R2, como por exemplo, ativar o uso da Extended Stored Procedure XP_CMDShell. Começando pelo uso da Stored Procedure para ativação da XP_CMDShell, conforme apresentado abaixo:

  1. 1.       Ativando a XP_CMDShell e consultando seu status através das Facetas de Servidor:

Por se tratar de uma funcionalidade externa e também um recurso que pode possibilitar o acesso indevido a um usuário mal intencionado o Microsoft SQL Server, por padrão mantém este recurso oculto, bem como, desativado. Vamos então realizar o processo de ativação desta funcionalidade e posteriormente consultar o seu status através da Faceta, conforme o código apresentado abaixo:

sp_configure ‘ xp_cmdshell’,1

reconfigure with override

Após executar este pequeno bloco de código, vamos consultar o valor atribuído para Faceta Surface Area Configuration em sua propriedade DatabaseMailEnabled, utilizando os passos realizados anteriormente. Para ilustrar o valor da propriedade DatabaseMailEnabled, apresento a Figura 4:

Figura 4 – Propriedades disponíveis para faceta Surface Area Configuration, em especial a propriedade DatabaseMailEnabled.

Como já esperado ao executar a SP_Configure, o propriedade DatabaseMailEnabled, teve o seu valor alterado de False para True, o que representa que acabamos de alterar o seu valor e ativar esta funcionalidade para nossa instância de banco de dados.

O próximo passo é realizar justamente o mesmo procedimento, só que de forma inversa, alterando o valor na propriedade e consultado o seu status através da SP_Configure.

  1. Desativando a XP_CMDShell e consultando seu status através da SP_Configure:

Como a tela de Visualização de Facetas já esta aberta e também com a categoria Surface Area Configuration selecionada, vamos alterar o valor da propriedade DatabaseMailEnabled, alterando o seu valor de True para False e depois clicando no botão Ok.

Agora vamos executar o bloco de código apresenta abaixo para obter o retorno da alteração do status da propriedade DatabaseMailEnabled:

sp_configure ‘xp_cmdshell’

Ótimo, nossa alteração foi realizada de forma correta e neste momento a XP_CMDShell voltou ao seu status padrão, ou seja, esta desativada, conforme podemos observar a Figura 5, com base na valor apresentado na coluna Run_Value, retornado como zero (Zero), o que indica pelo SQL Server que o recurso, funcionalidade e propriedade esta desativada:

Figura 5 – Resultado da execução da System Stored Procedure SP_Configure.

Utilizando o Surface Area Configuration de forma avançada

Nossa última jornada será realizar a configuração de uma nova política disponível para o Surface Area Configuration, com base, no conjunto de condições (conditions) e facetas (facets) disponíveis no Policy Management (Gerenciador de Políticas).

Vamos então configurar uma nova Condição, conforme os passos apresentados abaixo:

  1. Conecte-se ao seu Servidor ou Instância SQL Server;
  2. No Explorador de Objetos (Object Explorer), navegue até o Menu Gerenciamento (Management);
  3. Selecione a opção Condições (Conditions), clicando com o botão da direita do mouse e escolhendo a opção Nova Condição (New Condition);
  4. Como base na Figura 6, realize a configuração da sua nova condição, utilizando os seguintes valores:
    1. Name: Condição – Ativar – AdHocRemoteQueries;
    2. Facet: Surface Area Configuration;
    3. Expression:
      1.                                                                           i.      Field: @ADHocRemoteQueries
      2.                                                                          ii.      Operator: =
      3.                                                                        iii.      Value: True
  5. Clique no botão Ok, para confirmar a criação desta nova condição.

Figura 6 – Tela de Configuração da Condição – Ativar – AdHocRemoteQueries.

Pronto, nossa nova condição esta configurado e criada, agora devemos configurar nossa nova política que estará fazendo uso desta condição e de sua faceta. Para isso, vamos realizar os seguintes passos:

  1. Utilizando o menu Management aberto, clique como o botão da direita sobre a opção Políticas (Policies), selecionando a opção Nova Política (New Policy);
  2. Como base na Figura 7, realize a configuração da sua nova condição, utilizando os seguintes valores:
    1. Name: Política – Ativando – AdHocRemoteQueries;
    2. Check Condition: Condição – Ativar – AdHocRemoteQueries;
    3. Evalution Mode: On Change: Log Only;
    4. Server Restriction: None; e
    5. Marque a opção Ativo (Enabled).
  3. Clique no botão Ok, para confirmar a criação desta nova política.

Figura 7 – Tela de Configuração da Política – Ativando – AdHocRemoteQueries.

Muito bem, nossa política esta criada e definida para ser executa somente quando o log de eventos sofre algum tipo de mudança que possa estar relacionada com esta política. Mas caso você queria testar ou avaliar a execução desta política, basta clicar com o botão da direita do mouse sobre a ela e escolher a opção Evaluate(Avaliar).

Observação: Vale ressaltar que estes procedimentos podem somente ser executados por usuários com permissões de nível de System Administrator, Security Administrator, Server Administrator ou Setup Administrator.

Itens relacionados

A seguir apresenta a relação de Stored Procedures que podem ser utilizadas com as Políticas de Gerenciamento

sp_syspolicy_add_policy_category   sp_syspolicy_rename_policy_category  
sp_syspolicy_add_policy_category_subscription   sp_syspolicy_repair_policy_automation
sp_syspolicy_configure sp_syspolicy_set_config_enabled
sp_syspolicy_delete_policy_category   sp_syspolicy_set_config_history_retention
sp_syspolicy_delete_policy_category_subscription   sp_syspolicy_set_log_on_success
sp_syspolicy_delete_policy_execution_history   sp_syspolicy_subscribe_to_policy_category
sp_syspolicy_purge_health_state   sp_syspolicy_unsubscribe_from_policy_category
sp_syspolicy_purge_history sp_syspolicy_update_policy_category
sp_syspolicy_rename_condition sp_syspolicy_update_policy_category_subscription
sp_syspolicy_rename_policy

Perfeito pessoal acredito ter conseguido cumprir o meu objetivo e mostrar de uma forma bastante simples como podemos utilizar o Surface Area Configuration dentro do Microsoft SQL Server 2008 R2.

Espero que você possa ter gostado, mais uma vez agradeço a sua visita, o seu interesse o meu blog, conto com sua participação.

Nos vemos em breve.

Um grande abraço, até a próxima

Obtendo informações sobre fragmentação com a sys.dm_db_index_physical_stats no SQL Server 2008 e R2

Dica – Obtendo informações sobre fragmentação com a sys.dm_db_index_physical_stats no SQL Server 2008 e R2.


Pessoal, boa noite.

Tudo bem? Gostaria de dividir com vocês mais uma experiência vivida nos últimos em um dos meus clientes. Desta vez, vou falar um pouco sobre fragmentação de dados.

Pois bem, a fragmentação de dados é um processo natural que ocorre diariamente em qualquer base de dados, pelo simples motivo da ocorrência de manipulação de registro através dos comandos DML – Data Manipulation Languagem, sendo eles: Insert, Update e Delete.

A fragmentação trata-se de uma consequência da entrada, saída e atualização das linhas de registro que forma nossas tabelas, índices e que ficam armazenadas diretamente em suas páginas de dados.

Muito bem, esta fragmentação pode gerar diversos problemas, dentre eles:

  • Lentidão;
  • Aumento no tempo de processamento para realização de transações;
  • Locks e bloqueios de tabelas e dados;
  • Aumento no custo de processamento para o SQL Server realizar suas transações internas a fim de concluir seus processos administrativos;
  • Aumento no espaço no alocada de informação, gerando um crescimento no tamanho dos arquivos de dados;
  • Aumento nos arquivos de backups; e
  • Aumento no tempo para realização e restauração de um backup.

Com base neste conjunto de situações, em um dos mais atuais clientes, realizei diversas análises com objetivo de procurar entender como a fragmentação esta sendo gerada e de que forma poderia resolver este problema neste momento.

Foi através de algumas consultas ao Books On-Line que encontrei a Função de Gerenciamento Dinâmico chamada: sys.dm_db_index_physical_stats, presente a partir do SQL Server 2008. Mas qual é a finalidade desta função? Para este respostas vou utilizar as informações do próprio Books On-Line:

A sys.dm_db_index_physical_stats: “Retorna informações de tamanho e fragmentação dos dados e índices da tabela ou exibição especificada. Para um índice, uma linha é retornada para cada nível da árvore B em cada partição. Para um heap, uma linha é retornada para a unidade de alocação de IN_ROW_DATA de cada partição. Para dados LOB (objeto grande), uma linha é retornada para a unidade de alocação de LOB_DATA de cada partição. Se houver dados de estouro de linha na tabela, uma linha será retornada para a unidade de alocação de ROW_OVERFLOW_DATA em cada partição.”

Analisando este definição, ficou fácil entender qual a finalidade desta função de gerenciamento dinâmico. Muito bem, agora me restava saber como utilizar, e ai mais uma vez o bom e velho Books On-Line me ajudou, apresentando como sempre alguns exemplos que podem ajudar em muito, dentre os exemplos existentes, utilizei o exemplo referente a Reconstrução e Reorganização de Índices, mas com algumas customizações para a minha necessidade, denominado Exemplo 1, conforme apresento a seguir:

Exemplo 1: Utilizando a sys.dm_db_index_physical_stats em um script para reconstruir ou reorganizar índices SET NOCOUNT ON;

DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000);

SELECT
object_id AS Id_Objeto,
index_id AS Id_Indice,
partition_number AS PartitionNumber,
avg_fragmentation_in_percent AS Frag
INTO #CargaFragmentacaoIndices
FROM sys.dm_db_index_physical_stats (DB_ID(‘WELT_23092011’), NULL, NULL , NULL, ‘LIMITED’)
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;

DECLARE partitions CURSOR FOR SELECT * FROM #CargaFragmentacaoIndices;

OPEN partitions;

WHILE (1=1)
BEGIN;
FETCH NEXT FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag;

IF @@FETCH_STATUS < 0 BREAK;

SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;

SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE  object_id = @objectid AND index_id = @indexid;

SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;

       — Nesta parte do código realizo a análise para identificar com base na % de fragmentação qual procedimento deveria ser realizado, dentre eles: Reorganizar ou Recriar o Índice —

        IF @frag < 40.0
SET @command = N’ALTER INDEX ‘ + @indexname + N’ ON ‘ + @schemaname + N’.’ + @objectname + N’ REORGANIZE’;

IF @frag >= 50.0
SET @command = N’ALTER INDEX ‘ + @indexname + N’ ON ‘ + @schemaname + N’.’ + @objectname + N’ REBUILD’;

IF @partitioncount > 1
SET @command = @command + N’ PARTITION=’ + CAST(@partitionnum AS nvarchar(10));

EXEC (@command);
PRINT N’Executed: ‘ + @command;
END;

CLOSE partitions;
DEALLOCATE partitions;

DROP TABLE #CargaFragmentacaoIndices;
GO

Vale ressaltar que antes da execução do Exemplo 1, boa parte das tabelas apresentavam taxas de fragmentação de 75% á 98%, valores que normalmente são considerados altos o que dificultam em muito os processos de consulta de dados.

Após a execução do Exemplo 1, os valores médios de fragmentação não passavam de 75%, lógicamente fazendo a soma de todos os índices vinculados as tabelas. Em algumas tabelas as valores de fragmentação praticamente não sofreram mudanças, mas por outro lado tabelas que estava apresentando área de espaço alocado de forma desnecessária foi identificado uma redução de 48%, algo que representa-se muito em espaço de armazenamento.

Estas tabelas que sofreram uma diminuição em seu tamanho de espaço em disco, foram também as que mais tiveram suas taxas de fragmentação reduzidas entre 10% e 25%.

Mas uma pergunta continuava e ser feita, porque não é possível zerar a fragmentação de dados, mesmo após a execução de procedimentos como DBCC INDEXDEFRAG e DBCC DBREINDEX. A resposta é simples!!!

Não podemos eliminar totalmente a fragmentação de uma tabela ou índice sem realizar processos de análise e desfragmentação de suas páginas de dados, pois como os dados são alocados constantemente nestas páginas, sempre estará ocorrendo a movimentação de dados ou fragmentados de dados entre as páginas, armazenados diretamente em nossos discos rígidos.

Para que possamos tentar zerar se possível a fragmentação de dados, temos que procurar entender toda arquitetura das páginas de dados, sua forma de alocação de dados, sequência de armazenamento, extensão, espaço livre e ocupado para cada tabela e índices.

Bom, vou encerrar este dica aqui, espero que estas informações possam ser úteis em suas atividades.

Agradeço a sua visita, nos encontramos em breve.

Até mais.