On-demand virou domínio público…

Olhá só esse conteúdo pessoal! Já fiz curso com Fabiano e recomendo!

Blog - Fabiano Neves Amorim

Perae djow, você disse de graça?

screenshot_67

Fala galera…
É, você não tem mais desculpa para deixar de estudar né? :-)Boa notícia pra vocês (assim espero), os treinamentos que gravei para a Sr.Nimbus, os on-demand, estão disponíveis para acesso gratuito no youtoba. Sim, você leu isso mesmo… de graça, for free, na faixa…

Acesse as playlists utilizandos os links abaixo:

Planos de Execução – Parte I – QO, lookup, sort e merge join

Planos de Execução – Parte II – Estatísticas I, seeks e scan

Planos de Execução – Parte III – Estatísticas II e spools

O download do material utilizado nos treinamentos estão disponíveis aqui:

https://mcflyamorim.files.wordpress.com/2017/02/material-treinamento-ondemand.docx

Eu só peço uma coisa, por favor, de o crédito a quem merece crédito… plágio é feio e saiba que ao fazer isso você terá meu maior desprezo.

Abs. e bons estudos!

Ver o post original

Anúncios
Publicado em Uncategorized | Deixe um comentário

Como validar sucesso ou erro na chamada do xp_cmdshell do SQL Server

PessoALL, tudo tranquilo?

Hoje deixo uma dica extremamente simples mas que ajuda e muito na identificação de rotinas com erro.

Primeiramente apenas gostaria de deixar claro que não sou grande fã do uso do xp_cmdshell e muitas vezes as rotinas desenvolvidas que utilizam essa feature deveriam ser executadas por outra ferramenta e não o SQL Server (ou outro SGBD usando tecnologia parecida).

Pra quem não conhece o XP_CMDSHELL possibilita a execução de utilitários dentro do Windows (Linux? Num futuro?). Imagine você no cmd (DOS?) do Windows, imaginou? Estamos praticamente falando da mesma coisa usando xp_cmdshell.

Por padrão ele não vem habilitado, isso por que até a Microsoft entende que pode ser um grande problema no fator segurança em isolamento S.O vs SGBD. Ele faz parte do conteúdo disponível nas “opções avançadas” da configuração da instância. Então pra habilitar o recurso você precisa executar os comandos abaixo.

exec sp_configure 'advanced option', 1
reconfigure

exec sp_configure 'xp_cmdshell', 1
reconfigure

Uma vez que o recurso está habilitado…. vamos usa-lo.

Vamos com o clássico “dir”.

xp_cmdshell_dir

Na imagem acima vemos o “output” trazendo as informações retornadas pelo “dir”. Apenas pontuando que output e return value são coisas diferentes.

O valor de retorno do xp_cmdshell será o errorlevel gerado pelo seu shell (input execução). Em outras palavras….. quando a execução do conteúdo passado ao xp_cmdshell gerar erro (errorlevel diferente de 0) este irá o valor de erro (que é 1).

Exemplificando usando o comando “cd”. Abaixo temos a realização de acesso a pasta C:\Windows com sucesso (return 0) e acesso a pasta C:\WWWWindows com erro (return 1) uma vez que a pasta não existe.

return_success_xp_cmdshell

return_error_xp_cmdshell

Observe com atenção que não é gerado um erro ou EXCEPTION no SQL Server durante tentativa de acesso ao caminho que não existe. Isso não serve só para “cd” mas tantos outros utilitários, BCP utility e Dtexec utility possuem o mesmo comportamento.

Você consegue realizar a validação via T-SQL conforme abaixo.

declare @value_result tinyint
exec @value_result = xp_cmdshell 'cd C:\WWWWindows'

if(@value_result <> 0)
begin
	print 'ERRO'
end
else
begin	
	print 'SUCESSO'
end

Se você precisa gerar uma EXCEPTION é só lançar um RAISERROR.

exception_xp_cmdshell

Então se você utiliza o SQL Server e xp_cmdshell. Seja para mover arquivos, compactar arquivos, deletar arquivos, executar pacotes de DTS (Dtexec.exe), fazer BCP e muitas outras atividades. Recomendo adicionar essa validação, assim quando a atividade executada pelo xp_cmdshell falhar, você ficará sabendo!

Por agora é só….. e como de costume vou atualizando o post, corrigindo erros de português e etc conforme o tempo. Abs!

Publicado em SQLServer | Marcado com , , , , , , , , | Deixe um comentário

Como remover as horas da data (datetime) no SQL Server

Olá PessoALL,

Hoje post pratico e rápido… e o título meio estranho ao ler… mas como removemos a hora, minuto e segundo de um campo de datatype DATETIME no SQL Server? Ou truncar as horas, como é dito por muitos profissionais Oracle?. Sabe aqueles momentos que você quer buscar todos os registros de um único dia mas ele possui hora, minuto e segundo?

Pois bem….. vamos a principio lembrar que existem N tipos de datatypes para se trabalhar com datas no SQL Server. Eles estão listados aqui neste link. Vamos lembrar também que o SQL Server não salva datas com formato, como já postei e exemplifiquei neste post.

Agora… a título de ilustração vamos imaginar a tabela abaixo.

create table table2
(
id_registro int primary key identity,
horario_registro datetime not null,
comentario varchar(512) not null
);

Imagine que nesta tabela possui diversos registros por dia (horario_registro) e você quer apenas os de hoje. Quais são as opções?

Talvez essa?

select * from table2
where horario_registro = '20160622'

A consulta acima não irá trazer nenhum registro, por que? Claro…. você está passando o dia que será realizado “casting” dele para o DATETIME, que terá as “horas zeradas”, ou seja meia-noite, e nenhum registro foi inserido nesse horário. Como eu sei que foi “castado” para datetime? Veja o plano de execução.

predicate_datetime

Pois bem…. então vamos remover as horas do “horario_registro” ou melhor dizendo realizar “casting” dele para DATE.


select * from table2
where cast(horario_registro as date) = '20160622'

Agora sim ….. temos o resultado que queríamos… certo?

A solução vai funcionar muito bem para pequenas tabelas e validações rápidas.

Como ela funciona? O campo “horario_registro” será convertido para o tipo DATE, este não armazena hora, minuto e segundo. Assim o SQL Server não usará esses atributos durante o comparativo. O SQL Server é inteligente e fará também o casting do valor a ser pesquisado para DATE, diferente da ultima tentativa que foi feito casting para DATETIME.
Vejamos no plano de execução….
predicate_date

Pois bem… então o “zerar as horas” ou “truncar as horas” é simplesmente o casting do campo/valor de DATETIME para DATE? Exatamente!

Agora… esse método é o recomendado? Não! Por que não? Porque ele irá atrapalhar o SQL Server de usar índices! Então como podemos procurar um dia inteiro em um campo de DATETIME?


-- Usando menor ( < )
select * from table2
where horario_registro >= '20160622 00:00:00'
and horario_registro < '20160623 00:00:00'

ou…

-- Usando menor igual ( <= )
select * from table2
where horario_registro >= '20160622 00:00:00'
and horario_registro <= '20160622 23:59:59.997'
<pre>

Ou usando variáveis…

declare @hoje_inicio datetime = cast(getdate() as date)
declare @hoje_final datetime = dateadd(day, 1, @hoje_inicio)

-- Usando menor ( < )
select * from table2
where horario_registro >= @hoje_inicio
and horario_registro < @hoje_final

ou…

declare @hoje_inicio datetime = cast(getdate() as date)
declare @hoje_final datetime = dateadd(day, 1, @hoje_inicio)

-- Usando menor igual ( <= )
set @hoje_final = dateadd(MILLISECOND, -3, dateadd(day, 1, @hoje_inicio) )
select * from table2
where horario_registro >= @hoje_inicio
and horario_registro <= @hoje_final

Explicando…

Por que a variável é DATETIME e foi atribuido o getdate() com CAST as DATE? Para truncar as horas! A variável terá o valor do dia de hoje com as como “00:00:00.000”!

Por que “20160622 23:59:59.997” e “dateadd(MILLISECOND, -3”? Porque o tipo DATETIME possui a precisão de até três casas após segundos, ou em milissegundos. Isso muda conforme muda o tipo para smalldatetime, timestamp, datetime2 e etc.

Em resumo…. pratico e rápido? Principalmente usando em variáveis?  CAST as DATE!

Por hoje é só… vou corrigindo e aprimorando com o tempo…. vlw!

Publicado em SQLServer | Marcado com , , , , , , , , , , , , | Deixe um comentário

Perdi a senha do SA do SQL Server, e agora?

É… faz tempo que não publico nada por aqui.

Acreditem se quiserem mas este post possui rascunho de mais de 1 ano. Queria testa-lo ao máximo e apresentar o maior número de ilustrações possíveis mas infelizmente já não possuo o mesmo tempo que há 1 atrás rsrs. Estarei atualizando ele o mais rápido possível e principalmente dependendo do número de visualizações. Vamos lá…

Perdi a senha do sa do SQL Server, e agora?

Em muitos ambientes o controle dos usuários com permissões de sysadmin são restritas a uma pessoa (DBA?) ou algumas pessoas. Esse cenário é o recomendado, já que o privilegio de sysadmin permite a execução de qualquer atividade dentro do SQL Server e até mesmo fora dele (Windows?). Mas o que fazer se você perder/esquecer a senha do usuário de sysadmin? Seja em uma maquina de teste ou em um servidor de produção.

Vale ressaltar que o processo aqui descrito é de alteração da senha do usuário sysadmin, seja o sa ou algum outro usuário criado. O SQL Server criptografa a senha antes de armazena-la e você não terá acesso a senha anterior, pelo menos não de forma nativa e/ou por meios normais; a não ser o SQL Server 2000 ou 2005 conforme demonstrado no item 5.

* A opção 4 muitas vezes é a mais rápida, pratica e/ou ideal. 😉

 

 

1. Você possui login/senha de outro usuário que também é sysadmin. * Testado! Sempre funciona!

Fácil! Conecte-se com o usuário sysadmin a instancia de SQL Server e altere a senha utilizando o comando correspondente a sua versão de SQL Server.

SQL Server 2000
ou
SQL Server 2000

SQL Server 2005 até SQL Server 2014

 

 

2. Você possui login/senha de outro usuário que é securityadmin. * Testado! Sempre funciona!

Fácil! Conecte-se com o usuário securityadmin a instancia de SQL Server e altere a senha utilizando o comando correspondente a sua versão de SQL Server.

SQL Server 2000
SQL Server 2000

SQL Server 2005 até SQL Server 2014

 

 

3. Você possui um usuário de Windows configurado como Administrador local da maquina/servidor e sua versão de SQL Server é 2005, 2008 ou 2008R2. * Testado! Sempre funciona!

– Nessa opção você terá que realizar um stop/start do SQL Server.


Troubleshooting: Connecting to SQL Server When System Administrators Are Locked Out

 

 

4. Todas as opções acima falharam e sua versão de SQL Server é 2005, 2008, 2008R2 ou 2012.
Nessa opção você realiza um “truque” usando uma ferramenta externa para execução do SSMS no contexto da conta de serviço “SYSTEM”. Quase que um “hack”. * Testado! Sempre funciona!

Recover Access To a SQL Server Instance

Se você tiver dificuldade com inglês. Olha só o resumo:
– Baixa a ferramenta oficial da Microsoft: PsExec
– Por linha de comando você executa o SQL Server Management Studio, exemplo:

 PsExec -s -i "C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Ssms.exe"

– Logue-se no seu SQL Server como se fosse o usuário “SYSTEM”

 

 

5. Meu SQL Server é 2000 ou 2005. * Testado! Não consegui reproduzir ainda.

Essa opção é a única que irá exibir a senha do usuário. O pré-requisito é que deva existir uma conexão ativa do usuário que deseja descobrir a senha com o SQL Server e este usuário seja do SQL Server (não Windows). Lembrando que pode funcionar ou não dependendo do Service Pack e/ou HotFix.

On The Topic Of Lost SA Passwords On SQL Server 2000

Eae? Ajudou? Conseguiu?

Publicado em SQLServer | Marcado com , , , , , , , , , , , , , , | Deixe um comentário

Estimando o tamanho do backup no SQL Server

Imagine um cenário… Você tem que fazer um backup de um banco de dados em um disco local para alguma atividade ou simplesmente por ter que implementar como sua rotina de backup, você não sabe o tamanho que os backups vão utilizar e existe a chance de estouro do disco.

Se você tiver mais de um disco você pode usar como manobra a realização dos backups em multiplos arquivos (aka Stripes). Mas mesmo se estiver com apenas um disco ou mais de um ainda é interessante realizar uma estimativa de tamanho, certo?

Podemos usar o histórico de backup dos bancos de dados. Na backupset você encontra o campo backup_size que mostra o valor utilizado/alocado pelo arquivo de backup gerado.

Mas…… eu uso o backup em compression ?! Show! Então dá uma olhada na compressed_backup_size. Se você não sabe se usa/usou ou não a compressão do backup, se os campos backup_size e compressed_backup_size mostram o mesmo valor, a compressão de backup não foi ativada.

Bacana mas…. o SQL Server aloca o espaço estimado e depois realiza o compressão do arquivo gerado e no meu cenário isso é um problema! Então você precisa do efeito gerado a partir da ativação da Trace Flag 3042. Com o trace flag ligado, o arquivo de backup crescerá até o tamanho necessario pela compressão do backup. Mas é garantido? Teste e veja….. sempre primeiro no ambiente não produtivo é claro.

Uma variante do Script apresentado no link acima.

SELECT 
   msdb.dbo.backupset.database_name,  
   msdb.dbo.backupset.backup_start_date,  
   msdb.dbo.backupset.backup_finish_date, 
   datediff(minute, msdb.dbo.backupset.backup_start_date,  msdb.dbo.backupset.backup_finish_date) as elapsed_time_minutes,
   CASE msdb.dbo.backupset.type  
       WHEN 'D' THEN 'Database (Full)' 
       WHEN 'L' THEN 'Log' 
       WHEN 'I' THEN 'Differential'
       WHEN 'F' THEN 'File or filegroup'
       WHEN 'G' THEN 'Differential file'
       WHEN 'P' THEN 'Partial'
       WHEN 'Q' THEN 'Differential partial'
   END AS backup_type,  
   cast(msdb.dbo.backupset.backup_size / 1073741824 as decimal(10,2)) backup_size_GB,   
   cast(msdb.dbo.backupset.compressed_backup_size / 1073741824 as decimal(10,2)) as compressed_backup_size_GB,
   CASE msdb.dbo.backupmediafamily.device_type
    WHEN 2 THEN 'DISK'
    WHEN 5 THEN 'TAPE'
    WHEN 7 THEN 'VIRTUAL DEVICE'
    WHEN 105 THEN 'PERMANCE BACKUP DEVICE'
    ELSE 'OTHER'
    END AS device_type_desc,
    msdb.dbo.backupmediafamily.logical_device_name,
   msdb.dbo.backupmediafamily.physical_device_name
FROM   msdb.dbo.backupmediafamily  
   INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
WHERE (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7)  
ORDER BY 
   msdb.dbo.backupset.backup_finish_date desc,
   msdb.dbo.backupset.database_name

O AdventureWorks sendo realizado com e sem backup compression.

Backup Size

hmmm… 05AM já… depois eu corrijo os erros de português… e por agora isso é tudo! vlws! flws! 🙂

Publicado em SQLServer | Marcado com , , , , , , , , , , , | Deixe um comentário

Restore de log travado em 100% no SQL Server

Já observaram algum caso que o restore de um log acabou exibindo o percent_complete da sys.dm_exec_requests em 100 mas continuou lá por um bom tempo? Ou está presenciando isso agora? Meu restore de log está travado ou bugado?

Provavelmente não…. mesmo que seu restore de log esteja em execução há 2+ horas. Tudo vai depender das transações que existem nesse arquivo de backup de log. Primeiro vamos entender por que o valor de 100% é exibido por tanto tempo.

A operação de restore consiste em três fases. São elas:

1 – Data Copy Phase
2 – Redo Phase
3 – Undo Phase

Durante a fase de Data Copy, todos os dados contidos nos arquivos de backup são lidos e distribuídos/movidos para os arquivos de banco de dados (database files). No termino desta fase, o SQL Server irá reportar que o processo de restore atingiu o 100%. Ou seja, o percentual apresentado lá no percent_complete da sys.dm_exec_requests faz referencia apenas a atividade desta fase.

Na fase de Redo, todas as transações comitadas presentes no arquivo de transaction log quando o backup do log foi realizado são persistidas (rolled forward).

Na fase de Undo, todas as transações não comitadas presentes no arquivo de transaction log quando o backup do log foi realizado são descartadas (rolled back). Se o restore for realizado com a opção NORECOVERY, a fase de Undo é pulada (ou postergada).

Dito isso, fica claro o por que ser exibido o valor de 100% no processo de restore por tanto tempo. O percentual apresentado se refere exclusivamente a fase de Data Copy. Mas como eu descubro em qual percentual ou qual atividade/step estamos após o termino da fase de Data Copy? Bem….. até o momento que eu escrevia esse post não encontrei resposta para tal questão.

Lembrando que existem outros fatores que podem influenciar no tempo necessário para realização de um restore. Alguns são o número de VLF’s, fator I/O, fator Memoria e manipulação de datafile (crescimento/redução).

Fazia tempo que não postava nada por aqui 🙂 ….. Por agora é tudo….

Mais?

Understanding How Restore and Recovery of Backups Work in SQL Server

Publicado em SQLServer | Marcado com , , , , , , , , | Deixe um comentário

Obter lista de usuários do Active Directory pelo SQL Server

Faz tempo desde meu ultimo post por aqui. O de hoje é rápido, ainda não cheguei a aplica-lo em um caso real mas por curiosidade procurei saber se seria possível. Já pensou em fazer um select nos usuários do AD como você faz no SQL Server? Pois é, conseguimos tal efeito ao utilizar o SQL Server com um linked server para nosso servidor de AD. Veja abaixo.

Criamos o Linked Server de nome ADSI (ou qual nome desejar) usando o ADSDSOObject – Microsoft OLE DB Provider for Microsoft Active Directory Service.

EXEC master.dbo.sp_addlinkedserver
  @server = N'ADSI'
, @srvproduct=N'Active Directory Services'
, @provider=N'ADsDSOObject'
, @datasrc=N'server_name.your_domain.com'

A execução dos comandos será realizada utilizado o contexto do login do usuário em contexto atual. Ou você pode mudar o comportamento deste criando um login a ser utilizado, como demonstrado abaixo.

EXEC master.dbo.sp_addlinkedsrvlogin 
  @rmtsrvname=N'ADSI'
, @useself=N'False'
, @locallogin=NULL
, @rmtuser=N'your_domain\domain_user'
, @rmtpassword='********'

Então o select. Para saber sobre as demais colunas que você pode obter de uma olhada em MSDN – All Attributes Active Directory.

SELECT * FROM OPENQUERY (
  ADSI,
  'SELECT distinguishedName
  FROM ''LDAP://DC=your_domain,DC=com'''
)

Links uteis:

ADSDSOObject – Microsoft OLE DB Provider for Microsoft Active Directory Service

MSDN – All Attributes Active Directory

randomactsofsql – Querying Active Directory with T-SQL

Publicado em SQLServer | Marcado com , , , , , , , , , , , , | Deixe um comentário

Formatação padrão de data no SQL Server

Dando uma olhada nas estatísticas do blog percebi que a maioria das visitas ao blog é resultado de buscas por termos relacionados à formatação de data padrão do SQL Server. O interessante é que não havia abordado esse tema aqui ainda. Então vamos lá!

Deve-se ter em mente que o SQL Server armazena um valor do tipo Date no banco sem nenhum tipo de formatação e que o formato exibido é definido pela aplicação.

Em .NET C# é possível a configuração desse formato de data usando o método ToString junto com o formato desejado ou CultureInfo. Veja o exemplo em C# abaixo.

using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Globalization;
    using System.Threading;

    class Program
    {
        static void Main(string[] args)
        {
            DateTime hoje = DateTime.Now;
            
            foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
            {
                if(!ci.IsNeutralCulture)
                    Console.WriteLine(&quot;Formato {0} : {1} ---&gt; &quot; + hoje.ToString(new CultureInfo(ci.Name)), ci.Name, ci.DisplayName);
            }
            Console.ReadKey();
        }
    }

Saída:
Date Format

Mesmo não encontrando nenhuma documentação confirmando, pelo que notei o SQL Server Management Studio utiliza o padrão ODBC canonical (yyyy-mm-dd hh:mi:ss.mmm(24h)) e até o momento não é possível alteração dessa configuração padrão.

Date -> Varchar

Caso você precise formatar o output de um campo date para um formato especifico você pode utilizar a função CONVERT. Vale lembrar que valor é convertido para varchar e a formatação é predefinida e aplicada conforme o style passado para a função.

select getdate() [SSMS Default]
select CONVERT(varchar(20), getdate(), 103) [dd/mm/yyyy]
select CONVERT(varchar(20), getdate(), 101) [mm/dd/yyyy]
select CONVERT(varchar(20), getdate(), 100) [mon dd yyyy hh:miAM (or PM)]

Resultado:
Date Format

O SQL Server 2012 possui uma nova função para formatação, esta é mais flexível. A FORMAT permite informar a mascara desejada como parâmetro. Veja alguns exemplos.

select format(getdate(), 'dd.MM.yyyy hh:mm:ss') as [customFormat]
select format(getdate(), 'dd.MMMM.yyyy hh:mm:ss') as [customFormat]
select format(getdate(), 'dd.MMMM.yyyy hh:mm:ss', 'pt-br') as [customFormat]
select format(getdate(), 'dddd, dd "de" MMMM "de" yyyy', 'pt-br') as [customFormat]

Resultado:
Date Format

Varchar -> Date

O formato padrão que o SQL Server irá utilizar ao tentar realizar casting de um valor varchar para um date é definido pela language utilizada na configuração da instancia. Esse valor pode ser sobrescrito pela language associado a um login ou por configuração em nível de sessão.
Você pode verificar os valores configurados usando os comandos abaixo.

select * from sys.configurations where name like '%language%'

select * from sys.server_principals where default_language_name is not null

select @@LANGUAGE

Resultado:
Language

Veja no exemplo a seguir como a language pode interferir no casting do varchar para date. Repare que ao alterar a language o casting resultado em valores diferentes para mês e dia.

SET LANGUAGE 'Brazilian'
select @@LANGUAGE
SELECT CAST('06/03/2013' AS DATE) [FULLDATE], MONTH(CAST('06/03/2013' AS DATE)) [MONTH], DAY(CAST('06/03/2013' AS DATE)) [DAY]

SET LANGUAGE 'English'
select @@LANGUAGE
SELECT CAST('06/03/2013' AS DATE) [FULLDATE], MONTH(CAST('06/03/2013' AS DATE)) [MONTH], DAY(CAST('06/03/2013' AS DATE)) [DAY]

Resultado:
Language vs Date Fromat

Para não ter que se preocupar com a language você pode utilizar os formatos ISO (YYYYMMDD) e ISO8601 (YYYY-MM-DDTHH:MM:SS:MMM). Veja abaixo.

SET LANGUAGE 'English'
select @@LANGUAGE
SELECT CAST('20130603' AS DATE) [FULLDATE], MONTH(CAST('20130603' AS DATE)) [MONTH], DAY(CAST('20130603' AS DATE)) [DAY]

SET LANGUAGE 'Brazilian'
select @@LANGUAGE
SELECT CAST('20130603' AS DATE) [FULLDATE], MONTH(CAST('20130603' AS DATE)) [MONTH], DAY(CAST('20130603' AS DATE)) [DAY]

Resultado:
Language vs Date Fromat

Ou usando a função CONVERT.

select CONVERT(date, '06/03/2013', 103) [FULLDATE], day(CONVERT(date, '06/03/2013', 103)) [DAY], month(CONVERT(date, '06/03/2013', 103)) [MONTH]

select CONVERT(date, '03/06/2013', 101) [FULLDATE], day(CONVERT(date, '03/06/2013', 101)) [DAY], month(CONVERT(date, '03/06/2013', 101)) [MONTH]

Resultado:
Language vs Date Fromat

Alguns links com mais informações
SQL SERVER – Denali – String Function – FORMAT() – A Quick Introduction
SQL Server Date Formats
The ultimate guide to the datetime datatypes

edit: Finalmente adicionado as imagens para ilustração 😛

Publicado em SQLServer | Marcado com , , , , , , , , , , , , , | Deixe um comentário

Free eBooks

PessoALL!

Neste post estarei listando, conforme for encontrando, links para Free eBooks de diferentes assuntos/tecnologias, que eu já li ou pelo menos tenho comigo e espero estar lendo em um futuro próximo. Conforme encontro novos, estarei adicionando aqui.

Introducing Windows Server 2008 R2
Introducing Microsoft SQL Server 2008 R2
Introducing Microsoft SQL Server 2012
Complete Showplan Operators – Fabiano Amorim
Defensive Database Programming
SQL Server Execution Plans
The Red Gate Guide to SQL Server Team-based Development

Nota | Publicado em por | Marcado com , , , | Deixe um comentário