segunda-feira, 30 de maio de 2011

#15 - Listar Backups

Há um tempo, precisei saber a relação dos backups realizados e pelo servidor e saber a ordem execução dos mesmos e acabei achando um consulta  e aperfeiçoando um pouco. Nela consegui ver a relação de todos os bancos e os horários que estão executando o backup. 

use msdb;

SELECT 
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,
   msdb.dbo.backupset.database_name, 
   msdb.dbo.backupset.backup_start_date, 
   msdb.dbo.backupset.backup_finish_date,
   msdb.dbo.backupset.expiration_date,
   CASE msdb..backupset.type 
       WHEN 'D' THEN 'DATABASE-FULL'
       WHEN 'I' THEN 'INCREMENTAL'
       WHEN 'L' THEN 'LOG' 
       WHEN 'F' THEN 'File or filegroup' 
       WHEN 'G' THEN 'Differential file'
       WHEN 'P' THEN 'Partial'
       WHEN 'q' THEN 'Differential partial'
   END AS backup_type, 
   msdb.dbo.backupset.backup_size, 
   msdb.dbo.backupmediafamily.logical_device_name, 
   msdb.dbo.backupmediafamily.physical_device_name,  
   msdb.dbo.backupset.name AS backupset_name,
   msdb.dbo.backupset.description
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.database_name,
   msdb.dbo.backupset.backup_finish_date;

sexta-feira, 27 de maio de 2011

#14 - DATAS

Algumas funções bem interessante sobre datas do SQL Server, alguma delas podem ser úteis para sua vida.


select DATEPART(dw, GETDATE()) as 'DIA'
DIA
-----------
6



SELECT      GETDATE() AS 'Today',
            GETDATE() + 10 AS '10 dias a mais',
            GETDATE() - 10 AS '10 dias atrás'


Today                                    10 dias a mais                      10 dias atrás
-----------------------             -----------------------                  -----------------------
2011-05-27 11:19:11.570  2011-06-06 11:19:11.570            2011-05-17 11:19:11.570

SELECT      DAY  ( GETDATE() ) AS 'DIA',
            MONTH( GETDATE() ) AS 'Mês',
            YEAR ( GETDATE() ) AS 'Ano'


DIA         Mês         Ano
----------- ----------- -----------
27          5           2011






SELECT      DATEPART(DAY,   GETDATE()) AS 'Dia',
            DATEPART(MONTH, GETDATE()) AS 'Mês',
            DATEPART(YEAR,  GETDATE()) AS 'Ano',
            DATEPART(HOUR,   GETDATE()) AS 'Hora',
            DATEPART(MINUTE, GETDATE()) AS 'Minuto',
            DATEPART(SECOND, GETDATE()) AS 'Segundo'




Dia     Mês       Ano       Hora        Minuto      Segundo
------ --------- --------- ---------- ----------- -----------
27          5        2011        11          35          10









SELECT      GETDATE() AS 'Today',
            DATEADD(DAY,   10, GETDATE()) AS '10 Dias a mais',
            DATEADD(DAY,  -10, GETDATE()) AS '10 Dias atrás',
            DATEADD(MONTH,  1, GETDATE()) AS 'Próximo Mês',
            DATEADD(MONTH, -1, GETDATE()) AS 'Mês Anterior',
            DATEADD(YEAR,   1, GETDATE()) AS 'Próximo Ano',
            DATEADD(YEAR,  -1, GETDATE()) AS 'Ano Passado'







DECLARE     @Today      DATETIME = GETDATE()
DECLARE     @IDay       DATETIME = '2011-05-27 08:30:00'

SELECT DATEDIFF(DAY, @Today, @IDay) AS 'Days Left',
       DATEDIFF(MONTH, @Today, @IDay) AS 'Months Left',
       DATEDIFF(YEAR, @Today, @IDay) AS  'Years Left',
       DATEDIFF(QUARTER, @Today, @IDay) AS   'Quarters Left',
       DATEDIFF(HOUR, @Today, @IDay) AS     'Hours Left',
       DATEDIFF(MINUTE, @Today, @IDay) AS    'Minutes Left',
       DATEDIFF(SECOND, @Today, @IDay) AS    'Seconds Left'


Days Left   Months Left Years Left  Quarters Left Hours Left  Minutes Left Seconds Left
----------- ----------- ----------- ------------- ----------- ------------ ------------
-385        -12         -1          -4            -9243       -554590      -33275437


quinta-feira, 26 de maio de 2011

#13 XP_CMDSHELL - parte 2

Essa postagem não é minha foi retirada do fórum do iMasters (http://forum.imasters.com.br/topic/224741-xp-cmdshell/) pelo eriva_br (http://forum.imasters.com.br/user/16361-eriva-br/), achei muito boa e estou colocando aqui para compartilhar e colocando todos os links da fonte do post.


Caracteristicas:
Nome: XP_CMDSHELL
Localização: Banco de dados Master
Tipo: Extended Procedure
Descrição: Esta procedure executa uma sequencia de comandos em string do tipo shell no computador onde o sql server está instalado.
Utilidades: listar diretórios; criar, copiar, apagar arquivos; enviar mensagens, etc

Parâmetros:
'command_string', obrigatório, é o comando a ser executado
no_output, opcional, se colocado indica que não será retornado mensagem de saída na execução

Retornos:
retona 0 ou 1: 0-sucesso ou 1-Falha

Observações:
Obs1.: esta proc trabalha de forma sincrona, os comandos colocados abaixo dela só serão executados após o término de sua execução, ao contrário do comando shell do vb6 que trabalha de forma assincrona, ao ser executado, mesmo sem ter finalizado o comando já é liberado para a linha subsequente.
Obs2.: verificar segurança, tomar cuidados com SQL Injection, dica do nosso amigo Micox
http://www.macoratti.net/sql_inj.htm
http://www.google.com.br/search?hl=pt-BR&a...ta=lr%3Dlang_pt

Exemplos de uso:
exemplo 1: copiando um arquivo

declare @retorno INT
  EXEC @retorno = MASTER..xp_cmdshell 'copy C:\Lixo\teste.txt C:\Lixo\testeBKP.txt'
  select CASE WHEN @retorno = 0 THEN 'COPIADO COM SUCESSO' ELSE 'FALHA NO COMANDO' END as Retorno


exemplo 2: listando os arquivos de uma pasta
declare @retorno int
  EXEC @retorno = master..xp_cmdshell 'dir C:\lixo\'
  if @retorno = 0
          print 'comando executado com EXITO'
  else
          print 'FALHA no comando'

para testar esse exemplo verificando uma execução com sucesso e uma com falha, teste passando o caminho correto do arquivo e depois teste definindo o caminho incorretamente


exemplo 3: deletando um arquivo
EXEC MASTER..XP_CMDSHELL 'del C:\Lixo\teste.txt'


exemplo 4: enviando mensagens
EXEC master..xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server será desligado em em 1 minuto.'


exemplo 5: escrevendo em um arquivo texto
DECLARE @arqTexto VARCHAR(8000),
          @caminho VARCHAR(255),
                  @retEcho INT --variavel para verificar se o comando foi executado com exito ou ocorreu alguma falha
  
          SET @caminho = 'C:\Lixo\teste.txt'
  
          SET @arqTexto = 'ECHO Registro;CAMPO1;CAMPO2;CAMPO3 ' + CONVERT(VARCHAR(30),GETDATE()) +  ' >> ' + @caminho
  
          --remove caracteres não aceitos pelo comando ECHO, veja no final do post comentário
          select @arqTexto = dbo.FU_CONVERTE_TXT(@arqTexto)
  
          --escreve no arquivo txt, se ele naum existir será criado, se existir será adicionado (incrementado) a partir da última linha
          EXEC @retEcho = MASTER..XP_CMDSHELL @arqTexto, NO_OUTPUT --NO_OUTPUT indica que o comando não irá retornar alguma possível mensagem na sua execução
          IF (@retEcho <> 0)
          BEGIN
                  --caso ocorrer algum erro podemos retornar uma mensagem
                  SELECT 'ocorreu erro, verifique se o diretório existe' as Falha, @retEcho as retEcho
          END



exemplo 6: escrevendo arquivo texto, vamos escrever um arquivo texto com alguns campos da tabela authors do banco de dados pubs, através de um loop
--definindo o banco pubs
  use pubs;
  --definindo variaveis
  declare @arqTexto varchar(8000),
          @au_fname varchar(50),
          @au_lname varchar(50),
          @caminho varchar(255),
          @au_id varchar(20),
          @retEcho INT --variavel para verificar se o comando foi executado com exito ou ocorreu alguma falha
  
  --definindo o caminho e arquivo que será escrito, OBS: este caminho deve ser no servidor onde estiver instalado o SQL Server
  set @caminho = 'C:\Lixo\teste.txt'
  --setando o menor id para verificação do loop
  select @au_id = min(au_id) from authors
  --while da tabela authors
  while @au_id is not null
  begin
          --buscando os valores dos campos e adicionando nas variaveis
          select @au_id = au_id, @au_lname = au_lname, @au_fname = au_fname from authors
          where au_id = @au_id
          --setando o menor id para verificação do loop
          select @au_id = min(au_id) from authors
          where au_id > @au_id
          --definindo a linha que será escrita no arquivo txt
          SET @arqTexto = 'ECHO Registro;' + @au_id + ';' + @au_lname + ';' + @au_fname +  ' >> ' + @caminho
          --escreve no arquivo txt, se ele naum existir será criado, se existir será adicionado (incrementado) a partir da última linha
          exec @retEcho = MASTER..XP_CMDSHELL @arqTexto
          IF (@retEcho <> 0)
          BEGIN
                  --caso ocorrer algum erro podemos retornar uma mensagem
                  select 'ocorreu erro, verifique se o diretório existe' as Falha, @retEcho as retEcho
                  --parar o loop em caso de erro
                  break
          END
  end





Atenção:
Para escrever arquivo texto, cuidado com os caracteres especiais, pois se for um destes caracteres no comando a linha inteira não é escrita, dai imagina um arquivo texto de exportação faltando uma linha lá no meio do arquivo... como diria o Silvio Luiz, "o que que eu vou dizer lá no 'escritório'!"
Os caracteres que verifiquei até agora que não são aceitos pelo comando ECHO estão na função abaixo que fiz para trocar tais caracteres, se ver mais algum por favor nos avise:
CREATE FUNCTION FU_TRANSFORMA_CARACTERES (@Texto VARCHAR(8000))
  RETURNS VARCHAR(8000)
  AS
  BEGIN
  SET @Texto = UPPER(REPLACE(@Texto,'Á','A'))
  SET @Texto = UPPER(REPLACE(@Texto,'Á','A'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ã','A'))
  SET @Texto = UPPER(REPLACE(@Texto,'Â','A'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ó','O'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ô','O'))
  SET @Texto = UPPER(REPLACE(@Texto,'Õ','O'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ú','U'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ü','U'))
  SET @Texto = UPPER(REPLACE(@Texto,'Í','I'))
  SET @Texto = UPPER(REPLACE(@Texto,'É','E'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ê','E'))
  SET @Texto = UPPER(REPLACE(@Texto,'Ç','C'))
  SET @Texto = REPLACE(@Texto,'&','e')
  SET @Texto = REPLACE(@Texto,'"',' ')
  
  RETURN @Texto
  END



AUTOR: "eriva_br"

Dúvidas, criticas, contribuições, correções e adições seram bem vindas.

#13 XP_CMDSHELL - parte 1

O SQL tem o xp_cmdshell , é o shell de comandos do Windows que o SQL usa para executar comandos de forma bem simples. A forma de chamar a execução é bem simples como demonstrado abaixo:


xp_cmdshell { 'command_string' } [ , no_output ]

O "Command_string" são os comandos que serão passados como parâmetro, a limitação de tamanho varchar(8000), nvarchar(4000) .
"no_output" pode ser definido uma saída para um arquivo através desse parâmetro.

Para que este comando possa ser executado é necessário que antes seja habilitado no Servidor SQL, através do seguinte comando:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options',1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
O processo de Windows gerado por xp_cmdshell tem os mesmos direitos de segurança que a conta de serviço do SQL Server.
xp_cmdshell opera de forma síncrona. O controle não é voltado ao chamador até que o comando do shell de comandos seja concluído.
xp_cmdshell pode ser habilitado e desabilitado com o uso do Gerenciamento com base em Políticas ou pela execução de sp_configure.
mais informações clique aqui.

sexta-feira, 20 de maio de 2011

Oportunidade - DBA

Interessados encaminhar curriculo para aben.alves@hepta.com.br

Descrição da vaga de DBA.


• Atuará em modelagem, operação, suporte e manutenção de bancos de dados, em tunning de banco e tratamento de dados.Utilização de ferramentas de segurança destinadas ao gerenciamento e monitoramento de intrusão e de backup de banco de dados.

• Experiência em modelagem, operação, suporte e manutenção de bancos de dados. Experiência em tunning de banco e tratamento de dados.Experiência na utilização de ferramentas de segurança destinadas ao gerenciamento e monitoramento de intrusão e de backup de banco de dados.

• Experiência em banco de dados MS SQL Server 2000 e banco de dados POSTGREE 8.0.8.

• Conhecimento da sistemática de sistemas de gerenciamento de banco de dados (SGBD) e metodologias de backup de banco de dados.

• Ensino Superior completo na área de Informática ou qualquer curso Superior com especialização comprovada na área de Informática.

• Salário: R$ 3.600,00

• Benefícios: Assistência Médica / Medicina em grupo, Tíquete-alimentação

• Regime de contratação: CLT (Efetivo)

• Horário: Comercial.

#12 - Ebooks MS

Hoje acompanhando o Twitter vi a mensagem do  Marcos Freccia, sobre Ebooks gratuitos da Microsoft, achei interessante compartilhar com todos o link para baixar materiais de estudo. 

http://blogs.msdn.com/b/microsoft_press/archive/2011/03/03/ebooks-list-of-our-free-books.aspx