quarta-feira, 22 de junho de 2011

Oportunidade - sr. Nimbus


O esquema é o seguinte: quero selecionar currículos para nossa empresa, pois estamos com boas perspectivas. Me interessa dois perfis:

SQL Server - Dev
Conhecimentos: responsabilidades básicas de um DBA, administração e funcionamento básico do SQL Server, básico de otimização, experiência com T-SQL e também conhecimento de programação .NET. SSIS e SSRS são bem vindos.
Deve ser uma pessoa que pode se virar bem se tiver que escrever rotinas em C# ou T-SQL, que não viaje quando eu falar em design pattern ou arquitetura em camadas. Procuro alguém que saiba inglês e preferencialmente, tenha formação acadêmica forte.
Nível: pleno

SQL Server - Infra
Conhecimentos: responsabilidades básicas de um DBA, administração e funcionamento do SQL Server, básico de otimização, experiência com T-SQL, básico de infra-estrutura (AD, DNS, DHCP, etc.) e storage. Conhecer sobre DR, HA (ex.: cluster, mirroring), segurança e replicação é importante. SSIS e SSRS são bem vindos.
Deve ser uma pessoa que já administra um ambiente e que não viaje quando eu falar Kerberos, HBA, piece meal restore, etc. Procuro alguém que saiba inglês e preferencialmente, tenha formação acadêmica forte.
Nível: pleno

Notem que eu não estou colocando faixa salarial, estou totalmente aberto a negociação se você me provar valer quanto está pedindo.

[]s

Luciano [Luti] Caixeta Moreira
Microsoft MVP - SQL Server
http://luticm.blogspot.com/ - (61) 8150-0376

sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br - (61) 3010-2050

quarta-feira, 15 de junho de 2011

Vaga - Analista de Banco de Dados - AMBEV

Lígia Oliveira, xb3lcos@ambev.com.br, do Recrutamento e Seleção da
AmBev, informa : A Companhia de Bebidas das Américas – AmBev CONTRATA
Analista de banco de dados

- Curso Superior completo ou a seis meses da conclusão;
- Experiência em Excel Avançado (Macro/VBA);
- Experiência com Microsoft Access;
- Experiência com programação (SQL).

Local de trabalho: Brasília – DF
Nº de vagas: 3

Interessados enviar e-mail para xb3lcos@ambev.com.br com o nome da
vaga no título.

Programa de Certificação IBM


Escola Politécnica da Universidade de São Paulo - Programa de Certificação IBM


Quem sabe o PMI-Brasil, a LPI-Brasil e tantas outras, não despertem
para a mesma visão da IBM promovendo parcerias com Instituições de
Ensino Superior, particulares e públicas, visando a qualificação de
profissionais para o mercado? Fica a sugestão!

Universidade pública abre as portas para programa de certificação em
TIjunho 15, 2011 by Vinicius


A USP (Escola Politécnica da Universidade de São Paulo) enfim se
rendeu à necessidade do mercado quanto a qualificação dos
profissionais de Tecnologia da Informação e estabeleceu uma importante
parceria com a IBM.


Afinal, não é porque é aluno USP que é bom o suficiente do ponto de
vista de quem contrata. O aluno tem que atender a requisitos
específicos (qualificação) para ser aceito pelo exigente mercado, e
boa formação acadêmica, embora muito importante, é apenas uma parte da
solução para a alta demanda de profissionais de TI no mercado.

A parceria com a IBM trata-se do projeto de capacitação profissional
chamado “IBM Smart Professional”. Segundo o site TiInside…

O programa, que visa atender à demanda do mercado por profissionais da
área de tecnologia da informação, envolve união entre empresas e
universidades de todo o Brasil, com o objetivo de capacitar e
certificar estudantes, professores e profissionais de TI em
tecnologias IBM, de acordo com a necessidade do mercado local. O ‘IBM
Smart Professional’ oferece capacitação virtual. Já as certificações
são realizadas na própria universidade.

A importância da certificação profissional para qualquer candidato a
uma vaga na área de Tecnologia da Informação hoje em dia, é destacada
com essa afirmação interessante:

Segundo pesquisa do Institute Data Corporation (IDC) Brasil, as
chances de um profissional certificado conseguir um emprego aumentam
53% em relação a profissionais que não possuem este título. Para
aqueles que já estão no mercado, a pesquisa mostra que os
profissionais certificados podem alcançar salários de 10 a 100%
superiores à média que o mercado paga a profissionais sem certificação
que ocupam as mesmas funções.

As certificações disponíveis  pelo programa Smart Professional, da
IBM, são:

• Certificações UML, RUP, SOA, BPM, XML e Cloud Computing


Todas as certificações das linhas de produto:
• IUM: DB2, COGNOS, Content Manager, Informix, Optim;
• Rational: APPScan, Clear Quest, Functional Tester, Quality Manager,
RDZ;
• Lotus: Connections, Domino, Live, Notes, Quickr;
• WebSphere: WAS, WPS, iLOG, Message Broker , Lombardi;
• Tivoli: TSM, TIM, TAM, MAXIMO , Netcool.

A tendência de parcerias desse tipo entre universidades, incluindo-se
as públicas como neste caso, deve aumentar com o tempo, até porque é
muito custoso para uma instiuição de ensino, (mesmo em país de
primeiro mundo, quem dirá no Brasil), acompanhar o avanço da
tecnologia e ao mesmo tempo alinhar o preparo dos seus alunos para o
mercado de trabalho.

As grandes empresas do setor privado, como já é provado, tem um papel
fundamental no complemento da formação dos novos profissionais da
área, com parcerias com universidades e escolas de todo o Brasil.

Que o Governo possa criar mecanismos que incentivem mais essas ações,
e assim teremos um contingente profissional menos desempregado, mais
produtivo e realizado profissionalmente, pois gerar empregos que não
possam ser absorvidos pela sociedade (como já acontece muito nestes
tempos atuais) não resolve o problema de ninguém.

por (Lucianno Cardoso Luis email)

#18 - TRUNCATE - DB2

No ambiente DB2, quando o usuário solicita que você limpe o DB ou recrie o banco, surge uma dúvida usar um Delete ou Truncate para limpar o banco ou talvez recriar o banco executando um DROP e logo em seguida CREATE.

Analisando os possíveis cenários, hoje no ambiente em que trabalho os bancos são desenvolvidos com ferramentas de modelagem no qual podemos fazer todo o processo de geração de scripts ou engenharia reversa! Isso é um cenário perfeito, sei que não é todos os lugares que funcionam assim, então vamos a um outro cenário:

Já existe um DB que está em homologação e precisa apagar todos os dados e o sistema tem 'n' tabelas e não existe um modelo feito, a solução para limpar o DB é realizar um Truncate mas para isso é necessário descobrir quais são as tabelas do banco.

select tabschema , tabname from from syscat.tables where tabschema = 'XXX'

Após você descobrir quais são as tabelas do banco, basta montar um script para gerar a limpeza da tabela.

select ' TRUNCATE TABLE ' || rtrim(tabschema) || '.' || tabname || ' IMMEDIATE ;' from syscat.tables where tabschema = 'XXX'

Com a query acima você consegue o resultado para limpar todas as tabelas do seu banco por um determinado schema.

Executar um Truncate é mais rápido e performático do que o DELETE.

terça-feira, 7 de junho de 2011

#17 - Linked Server

Pequeno Script de criação de um Linked Server, para acesso com autenticação já existente em ambos os servidores.




EXEC master.dbo.sp_addlinkedserver @server = N'SQLDPTP', @srvproduct=N'SQL Server'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SQLDPTP',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL

GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'collation compatible', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'data access', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'dist', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'pub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'rpc', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'rpc out', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'sub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'connect timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'collation name', @optvalue=null
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'lazy schema validation', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'query timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'use remote collation', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'SQLDPTP', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO



quinta-feira, 2 de junho de 2011

VAGA DBA-DEV


Pessoal,
 
Estamos precisando de um DBA DEV com o seguinte perfil:
 
Conhecimento avançado e melhores práticas em programação T-SQL;
Conhecimento básico em administração SQL Server 2008;
 
 
Por favor, enviar currículo para andre@tecnologiapar.com.br  / socorrovieira@tecnologiapar.com.br

[]'s
--
Socorro Vieira

quarta-feira, 1 de junho de 2011

#16 - BULK INSERT

Algumas pessoas tem por costume fazer a importação de arquivos através do wizard do sql que é o jeito mais tradicional e fácil, que depois posso fazer um tutorial de como utilizar. Mas hoje recebi um email na lista de SQL SERVER pedido ajuda para criar uma procedure para importar um arquivo txt.


O SQL SERVER tem uma função é o BULK INSERT , ela é responsável por fazer fazer esse tipo de importação, você pode delimitar os separadores de linha, o que vale lembrar que este tipo de função não permite dar carga em campos específicos. O arquivo já deve estar totalmente formatado de acordo a tabela.

Um exemplo simples de como utilizar seria esse:


BULK INSERT DEC.dbo.Tab_Pernambucanas
   FROM 'C::\Temp\saldo_201012_v2.txt'
   WITH
      (
         FIELDTERMINATOR =',',
         BATCHSIZE = 10000
      );


Uma maneira de fazer uma procedure para esse tipo de inserção seria:


CREATE PROCEDURE IMPORTACAO (@TABLE VARCHAR(100),@CAMINHO VARCHAR(255), @DEL CHAR)
AS

declare @SQL VARCHAR(1000)
declare @err_instrucao varchar(255)

BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   begin transaction

       SET @SQL ='      BULK INSERT ' + @TABLE + '
                     FROM ' + @CAMINHO + '
                     WITH
                          (
                              FIELDTERMINATOR ='''+@DEL+''',
                              BATCHSIZE = 10000
                          )'
                         
      SET @err_instrucao = 'motivo do erro'
      exec (@SQL)

commit transaction
   return 0
err_instrucao:
raiserror (@err_instrucao,16,1)
      rollback transaction
      return 1
END

Essa é a minha sugestão, outros terão sugestões bem diferentes e todas as sugestões são bem vindas e ajudam no nosso crescimento profissional.

Outra informação importante é que esse tipo de instrução precisa de das seguintes permissões INSERT e ADMINISTER BULK OPERATIONS para poder executar. 


Para um banco de dados no modelo de recuperação completa, todas as operações de inserção de linha executadas pela importação em massa são registradas completamente no log de transações. Importações de dados grandes poderão fazer o log de transações ficar cheio rapidamente se o modelo de recuperação completa for usado. Por outro lado, no modelo de recuperação simples ou no modelo de recuperação bulk-logged, o log mínimo de operações de importação em massa reduz a possibilidade de uma operação de importação em massa preencher o espaço do log. O log mínimo também é mais eficiente que o log completo.
 (http://msdn.microsoft.com/en-us/library/ms190422.aspx)

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.