quinta-feira, 19 de abril de 2012

Como identificar a versão/edição do SQL Server?

Olá pessoal. Bom, estamos de volta para escrever algo que possa ajudá-los bastante. Quem nunca se deparou com as seguintes perguntas: Qual é a versão/edição e nível de atualização de seu SQL Server? Qual é o Service Pack dele? Está com a versão mais atualizada lançada pelo fabricante? Então, diante de perguntas como essas, abaixo vamos explanar algumas maneiras de recuperar essas informações. Primeiramente, para recuperar a versão do SQL Server e do Sistema Operacional sob o qual está instalado, nós podemos utilizar uma variável de ambiente, o @@version. Para tanto basta realizar um SELECT nesta variável que teremos um resultado similar ao que temos abaixo:  




Como vocês podem perceber, na primeira linha do resultado temos descrita a versão do SQL Server - nesse caso 2005 - e uma identificação numérica (9.00.453.00).
Essa numeração serve para identificar a compilação da versão. O número 9, do exemplo, indica que é um SQL Server 2005. Se fosse 8 seria da versão 2000, no caso de 10 seria versão 2008 e assim por diante.
Ainda sobre o exemplo, o número 4053 indica a compilação, a qual se refere a uma atualização do produto (patch, fix ou service pack).
Abaixo dispomos de um link que possui uma lista atualizada dessas compilações.
http://sqlsecurity.com/FAQs/SQLServerVersionDatabase/tabid/63/Default.aspx

Além disso, há uma forma de identificar a versão através das propriedades da instância. Para tanto, você poderá usar a função de sistema SERVERPROPERTY(). Através dela e informando o parâmetro correto, poderá verificar alguns dados importantes da instância. No exemplo abaixo, você conhecerá 3 parâmetros: ProductVersion, ProductLevel e Edition. 
O ProductVersion é usado para identificar a versão da instância - se é 2000, 2005, 2008 etc.
Já o ProductLevel serve para indicar se a instância possui a instalação original (RTM) ou se está com algum ServicePack (SP1, SP2 ...).
A propriedade Edition serve para indicar a edição da instância - Enterprise, Developer, Standard etc.



Para maiores informações dos parâmetros existentes, consulte o Books Online que lá existem detalhes de cada opção.


Bom, esperamos ter ajudado. Em breve traremos mais informações para você.

quinta-feira, 2 de setembro de 2010

Verificando quais logins pertencem à ServerRole SysAdmin via consulta T-SQL

Boa tarde, pessoal.
Há algum tempo não tenho postado nada no blog devido a diversas atividades profissionais que têm consumido bastante meu tempo. No entanto, tirei uma frestinha para escrever um script interessante onde podemos resgatar a lista de logins que pertencem à Server Role "SysAdmin" utilizando apenas uma consulta T-SQL.
Veja o script abaixo:

select L.name
from sys.server_principals P
     join sys.server_role_members M On M.role_principal_id = P.principal_id

    
join sys.server_principals U on U.principal_id = M.member_principal_id
    
join syslogins L on L.sid = U.sid
where
P.name = 'sysadmin'

quinta-feira, 1 de julho de 2010

Como pesquisar, de forma rápida, objetos referenciados no código fonte de outros objetos?

Boa tarde!
Hoje resolvi escrever um pequeno artigo sobre uma angústia que desenvolvedores e alguns DBAs iniciantes passam sempre que querem localizar um objeto dentro dos scripts criados dentro de um banco de dados SQL.

Como assim?
Vamos lá... dentro de um SGBD podemos criar alguns objetos programáveis que são criados através de scripts, ou códigos-fonte. No caso do SQL Server utilizamos o T-SQL (Transact SQL) para criar esses objetos. E o que ocorre: por diversas vezes nós, DBAs, precisamos identificar quais objetos fazem uso de uma determinada tabela ou internamente referenciam uma determinada função, dentre outros casos. Com isso, para tornar mais produtiva essa busca, podemos utilizar os recursos de busca (SELECT) da linguagem SQL.

Primeiramente faremos uma busca na visão de sistema syscomments. É através desta estrutura que conseguimos recuperar informações dentro das stored procedures, stored functions etc, através da coluna text.

declare @PalavraAPesquisar varchar(255)

set @PalavraAPesquisar ='Nome do objeto a procurar'

select distinct objects = object_name(C.id),
       CASE O.xtype WHEN  'P' THEN 'STORED PROCEDURE'
                    WHEN  'X' THEN 'SYSTEM PROCEDURE'
                    WHEN
  'V' THEN 'STORED VIEW'

                    WHEN  'TF' THEN 'SYSTEM FUNCTION'
                    WHEN  'FN' THEN 'STORED FUNCTION'
                    WHEN 'U' THEN 'TABLE'
                    ELSE O.xtypeENDas xtype
from syscomments C
    join sysobjects O on C.id = O.id

where text like '%' + @PalavraAPesquisar + '%'
order by objects

Em seguida, faremos uma pesquisa nas estruturas SysJobs e SysJobSteps. É através dessas estruturas que pesquisaremos se aquele determinado objeto é referenciado em algum Job.

declare @PalavraAPesquisar varchar(255)
 
set @PalavraAPesquisar ='Nome do objeto a procurar' 

select distinct name as objects, 'JOB' as xtype
from msdb.dbo.sysjobsteps S
      join msdb.dbo.sysjobs J on s.job_id = J.job_id
where command like '%' + @str + '%'
order by objects
 

Com esse simples script espero ter ajudado a melhorar seu tempo de busca a referência de objetos dentro da base.

Uma observação importante para vocês é que o código acima somente funcionará para os objetos que não estiverem criptografados. Caso contrário, não retornará o resultado.

Vale uma dica que seria juntar esses dois pequenos scripts em um só, criar uma stored procedure para isso, colocá-la num database universal, por exemplo o Master, e sempre poderá realizar a pesquisa a partir de qualquer database.

 

Até a próxima!!!

sexta-feira, 18 de junho de 2010

Rotina para identificação e desfragmentação automática das estruturas de um database.


Boa tarde!!!

Este post visa mostrar a vocês uma rotina para identificação das estruturas (tabelas e seus índices) que estão fragmentados de acordo com métricas previamente definidas e, automaticamente, reorganiza ou reconstrói os índices das tabelas.

Esta rotina recupera todos os índices que estão com o LogicalFragmentation acima de 20% ou o menor ScanDensity abaixo de 80% e realiza a reorganização destes.

Para os casos mais absurdos, que ultrapassem o limiar de 50%, o REBUILD do índice será realizado, com isso, a estrutura será refeita de forma organizada.

Uma observação importante é que essa operação poderá deixar a base lenta e gerar bloqueios para reorganização (REORGANIZE) / reconstrução (REBUILD). Vale ressaltar que o script poderá ser utilizado para as versões 2005 e 2008 do MS SQL Server.

Segue o script:

--Início do Script

use <nome-do-banco>

declare @maxLogicalFrag tinyint,

           @minScanDensity tinyint

--Métricas previamente definidas para os limiares de fragmentação e ScanDensity

set @maxLogicalFrag = 20

set @minScanDensity = 80

--Estrutura auxiliar que será criada no TEMPDB para guardar informações estatísticas das tabelas

if object_id('tempdb..#showcontig') is not null

       drop table #showcontig



create table #showcontig (

       ObjectName sysname,

       ObjectId int,

       IndexName sysname,

       IndexId int,

       Level int,

       Pages int,

       Rows int,

       MinimumRecordSize int,

       MaximumRecordSize int,

       AverageRecordSize int,

       ForwardedRecords int,

       Extents int,

       ExtentSwitches int,

       AverageFreeBytes int,

       AveragePageDensity int,

       ScanDensity int,

       BestCount int,

       ActualCount int,

       LogicalFragmentation int,

       ExtentFragmentation int

)

declare @nome as sysname

         , @str as varchar(512)

--Seleciona todas as tabelas do database que não são do sistema.

declare cTables cursor for

select name

from sys.tables

where name not like 'sys%'

--Loop para coleta de informações estatísticas sobre as tabelas e seus respectivos índices.

open cTables

FETCH NEXT FROM cTables INTO @nome

while @@fetch_status = 0 begin

       set @str = 'dbcc showcontig(' + @nome + ') with all_indexes, fast, tableresults'

       insert into #showcontig

       exec (@str)

       FETCH NEXT FROM cTables INTO @nome

end

close cTables

deallocate cTables

declare @ObjectName sysname, @IndexId int, @IndexName sysname, @cmd varchar(512)

declare cIndices cursor for

--Seleciona os índices para realizar o reorganize

select ObjectName

       , IndexId

       , IndexName

       , 'alter index ' + IndexName + ' ON ' + ObjectName + ' REORGANIZE;' as command

from #showcontig

where (ScanDensity <= @minScanDensity

          or LogicalFragmentation >= @maxLogicalFrag)

   and (ScanDensity > 50 or

           LogicalFragmentation < 50)

union

--Seleciona os índices para realizar o rebuild

select ObjectName

       , IndexId

       , IndexName

       , 'alter index ' + IndexName + ' ON ' + ObjectName + ' REBUILD;' as command

from #showcontig

where (ScanDensity <= @minScanDensity

      or LogicalFragmentation >= @maxLogicalFrag)

    and (ScanDensity <= 50 and

            LogicalFragmentation >= 50)

order by ObjectName, IndexId

--Loop para execução dos comandos gerados para a reorganização dos índices selecionados.

Open cIndices

FETCH NEXT FROM cIndices INTO @ObjectName, @IndexId, @IndexName, @cmd

while @@fetch_status = 0 begin

       exec (@cmd)

       FETCH NEXT FROM cIndices INTO @ObjectName, @IndexId, @IndexName, @cmd

end

close cIndices

deallocate cIndices

--Fim do Script

quinta-feira, 17 de junho de 2010

Apresentação

Olá, meu nome é David Almeida e estou iniciando este blog para compartilhar alguns conhecimentos e experiências sobre o MS SQLServer. A idéia é relatar as passagens e situações que ocorram de "diferente" no dia-a-dia do DBA e também postar scripts interessantes que venha encontrar e/ou criar para auxiliar em diversas ocasiões.

Tenho trabalhado com esta tecnologia desde 1999 e já passei pelas versões 6.5, 7.0, 2000, 2005 e 2008. Inicialmente fui desenvolvedor com diversas IDEs e MS SQLServer e desde 2006 sou DBA de um dos maiores grupos de Supermercados do país e que pertence a uma multi-nacional com mais de 100.000 colaboradores, sendo responsável por mais de . Sou MCP em SQLServer 2000 e MCITP em SQLServer 2008 Database Administrator. Além disso sou MCT e ministro cursos oficiais desta tecnologia.

Vamos lá e em breve postarei meu primeiro script...