Dica – Renomear base com mesmo nome, texto em caixas diferentes

O motivo de postar esse sapo é pelo mesmo motivo que a O'reilly publica seus livros com animais na capa

Olá,

Dica rápida de hoje.
Como renomear uma base para o mesmo nome com o texto em diferentes caixas (caixas baixas e altas).
Exemplo: alterar EssEnOme para EsseNome.O post leva em consideração também apenas instâncias com case insensitive.

Pra renomear bases de dados é muito comum utilizar a sp_renamedb por bons motivos:

  •  Procedure antiga já. Bem conhecida;
  • Sintaxe simples: EXEC SP_RENAMEDB ‘NomeBaseAtual’, ‘NovoNome’;
  • Antes de trocar o nome, faz algumas verificações (óbvias, mas necessárias);

Entretanto, a mesma tarefa pode ser executada com o comando ALTER DATABASE:

Mas o que acontece ao renomear uma base com o mesmo nome, com diferenças apenas nas fontes minúsculas e maiúsculas?

Ao usar a SP_RENAMEDB

Resulta na seguite mensagem:

The database ‘DB_aCesso’ already exists. Specify a unique database name.

O comando ALTER DATABASE vai funcionar tranquilo, e favorável:

Vale lembrar que tanto a sp quanto o comando ALTER DATABASE necessitam de lock exclusivo para efetuar a mudança no nome da base. Além de que comandos que alteram o nome da base exigem permissões de db_creator (na base), control server ou sysadmin.

[]’s
Fonte:

DMO’s de Índices: Testes, resets e rebuilds.

raizes, indices. A ideia era pra ser essa.

Era pra passar a ideia de raízes.

Olá,

Antes de iniciar o post, aviso que vou usar bastante o termo DMO (forma de agrupar os termos DMV e DMF). Clique aqui  e aqui  para ler mais sobre os termos.

DMO’s em geral (DMV’s e DMF’s) são coisas legais do SQL Server, que se tornaram disponíveis para uso público a partir do SQL Server 2005 e desde então tem facilitado bastante a obtenção de certas estatísticas relacionadas ao servidor SQL Server e/ou banco de dados em questão.

Existe uma classe de DMO’s extremamente útil que retorna informações relacionadas aos  índices:

Nome

Tipo

dm_db_index_operational_stats

SQL_INLINE_TABLE_VALUED_FUNCTION (DMF)

dm_db_index_physical_stats

SQL_INLINE_TABLE_VALUED_FUNCTION (DMF)

dm_db_index_usage_stats

VIEW (DMV)

Vou chamar todos os três de DMO neste post, embora pessoalmente goste de usar o termo DMV pra tudo (por conveniência), inclusive pra referenciar DMF. Não estou considerando DMO’s de Missing indexes, pois não são o tópico do momento.

O objetivo deste post é explicar o que cada DMO retorna como resultado entrando utilizando a prática pra fixar o conteúdo, demonstrando alguns detalhes do funcionamento de cada um destes itens que não são tão aparentes assim relativos à persistência destas informações, e que podem gerar entendimentos incorretos sobre as informações que ele retorna.

A verdadeira data de criação de um banco de dados

Processed with VSCOcam with f2 preset

Olá,

Como descobrir a verdadeira data de criação de um banco de dados? A princípio, parece ser uma pergunta simples de responder e a resposta aparece de quase imediato: veja na create_date da sys.databases. Mas estamos falando da verdadeira data de criação de um banco de dados, aquela que permanece a mesma mesmo se for a base restaurada em uma instância diferente.

Desafio #1 – Data Compression Labs

Books

Oi,

Antes de começar o próximo post do Compression Labs, tenho um pequeno e humilde desafio pra quem se interessar a responder (e eu até poderia dizer que estou fazendo isso pra ganhar  tempo fazendo de fazer um post direito, mas estaria sendo estupidamente honesto)…Vamos utilizar o script do Compression Labs #1 adaptado para montar o cenário: vamos criar desta vez duas tabelas, sendo que uma delas vai levar compressão de página.

Data Compression Labs #1 – Tipagem inteligente e páginas zumbis

Open books

Olá,

Compressão no SQL Server é de longe uma das features Enterprise mais importantes do produto presentes desde o SQL Server 2008.

Quem já implantou, viu (inúmeras) vantagens e quem não implantou tem vontade ou interesse. Já quem não gosta…caso patológico. Brincadeira, não conheço quem não tenha gostado.

Quando digo compressão  me refiro ao termo em geral, e o SQL Server entrega várias tecnologias de compressão. Os principais são  Backup Compression (abordado em um post passado) e Data Compression.

Então vamos falar um pouco sobre Data Compression…

Diferenças entre Instância Padrão x Instância Nomeada

Olá,

Mais um fast-post (postagem rapidona, tradução livre) pra ilustrar um cenário bem comum para quem usa SQL Server eventualmente: o conceito de instâncias nomeadas e instâncias padrão (default). Peço que tenham paciência pois irei partir do começo, e quando digo “começo”, eu falo da parte de instalação do SQL Server.

O processo de instalação é relativamente simples (quer aprender como faz utilizando as melhores práticas?) e não será detalhado aqui. Recomendo este vídeo no MVA especialmente pois ilustra uma instalação completa.

A tela que define a configuração de sua instância é essa aqui:

Padrão ou nomeada?

Assumo que você já conhece o conceito de instância do SQL Server e por isso vamos abordar três tópicos:

  •  Instância padrão
  • Instância nomeada
  • SQL Server Express

Instância padrão

A lei suprema do universo é que, em determinada máquina, só pode ter uma e apenas uma (e apenas uma e apenas uma e apenas u…) instância padrão (Default Instance). Jamais, em hipótese alguma, você poderá ter mais de uma instância padrão na mesma máquina, mesmo se você instalar várias instâncias de versões do SQL Server diferentes.

Por exemplo, se você instalou uma instância padrão do SQL Server 2008 R2 em sua máquina, e deseja instalar uma instância do SQL Server 2012 pra testes, você não pode instalar uma instância padrão, a mesma PRECISA ser nomeada.

Depois de instalado, se o serviço do SQL Server estiver online (pode ser conferido no SQL Server Configuration Manager ou em services.msc do Windows), como logamos?

Assim:

Opções para logar em uma instância padrão:

  • (local) – Como ilustrado na imagem acima;
  • . – Também conhecido como ponto.  Puro unix-pattern 🙂
  • NOMEDASUAMAQUINA – A sua máquina só pode possuir uma instância padrão, logo,
  • MSSQLSERVER – Aponta também para a instância padrão. Note que no ato da instalação, quando se seleciona default, esse é o nome que aparece (Instância padrão) .

Instância nomeada

Enquanto você só pode ter uma instância padrão em uma máquina, poderá ter N instâncias nomeadas. Olha como é criada uma instância nomeada:

nomeada

E como logamos em uma instância nomeada?

Instância nomeada

Ou seja: NomeDaMaquina\NomeInstancia

E o que tem haver o SQL Server Express?

É o campeão em frustar recém-chegados ao SQL Server 🙂

O motivo é a edição EXPRESS, que é bastante baixada seja por desenvolvedores ou para quem está pegando o jeito com o SQL Server, obrigatoriamente é nomeada.

E como logar? Usando um dos  nomes abaixo:

  • NomeDaSuaMaquina\SQLEXPRESS;
  • .\SQLEXPRESS

Porque achei interessante mencionar o SQL Express? Porque um amigo meu topou com essa dificuldade e talvez outra pessoa também tope.

E qual a diferença entre instâncias padrão e nomeada?

Basicamente configurações de conectividade (leia-se: nome do servidor e porta).

Porta pode se tornar um fator problemático  (sem devido conhecimento) se você estiver conectando em uma instância nomeada e o SQL Server Browser não está habilitado nela. Mas isso é assunto pra outro post 🙂

Referência: http://technet.microsoft.com/en-us/library/ms165614(v=sql.90).aspx

 

[]’s

 

Script – Informações de espaço em disco

Espaço em Disco

Olá,

O código a seguir tem a finalidade de capturar o espaço atual em disco. É uma mão na roda principalmente quando se usa o Central Management Servers pra disparar a mesma consulta para várias bases diferentes (possibilitando assim uma verificação rotineira mais rápida e prática).

Código

Saída:

Resultado

<Clique na imagem>

Second Shot está de volta!

Segunda chance

Boa notícia pra quem está estudando pra tirar certificações Microsoft.

A Microsoft liberou ontem (30/08/2013) o Second Shot!
Pra quem não conhece, é literalmente, uma segunda chance: você marca o seu exame pela Prometric informando o voucher adquirido em um dos links abaixo, e se por acaso o pior acontecer, você poderá marcar uma segunda vez o mesmo exame sem cobrança alguma.

Vouchers expire on May 31, 2014. All exams, including retakes, must be taken by May 31, 2014.

Lembrando que, extremamente importante…É necessário informar o voucher no ato do primeiro agendamento. Muita gente não se atenta para esse detalhe e acaba por perder a segunda chance que tava ali de graça por vacilo 😀

É isso. Bons estudos pra quem está nessa empreitada. =)

Reposta do Desafio #1 T-SQL, Ranking Functions (ROW_NUMBER, RANK E DENSE_RANK)

Resposta do desafio

Bom dia pessoal 🙂

Semana passada eu disse que postaria a resposta do desafio #1 T-SQL no começo da semana. Andei ocupado, só deu pra terminar agora.

Pra relembrar, o desafio foi este: http://radialog.wordpress.com/2013/07/12/checkpoint-pessoal-desafio-1-t-sql/.

Precisamos obter os segundos maiores salários de cada departamento. O desafio praticamente disse, com todas as letras (pelo menos a solução mais óbvia) foi que devemos particionar por departamentos e  rankear pelo segundo maior salário.

A resolução mais óbvia se encontra no que chamados de Ranking Functions, informação que você encontra aqui nesse link do MSDN. De cara, a questão sugere que façamos uma classificação…. A minha solução (a mais intuitiva possível) foi utilizando CTE (Common Table Expression).

A questão anterior trabalha com uma variável de tabela. Para fins de prática e para entendimento das funcionalidades, execute o script abaixo que é o mesmo código do desafio, porém, materializado para tabelas físicas, no tempdb.

Ok, temos a tabela populada. Note que em um SELECT simples, a tabela está ordernada por departamento, algo já pensando na inserção dos dados no início deste exercício. Como poderíamos tentar classificar as linhas? Vamos tentar um ROW_NUMBER() ?

Que trará o seguinte resultado:

Explicando o que a linha ROW_NUMBER() fez: Particionou por departamento e ordernou por salário. Falando de modo mais fácil,  ele vai numerar as linhas de acordo com o departamento, e não se baseando na tabela inteira (por isso a partição por departamento). Essa foi a forma MAIS PRÓXIMA que se dá pra chegar no desafio, claro, utilizando um r0w_number() sem maiores firulas. Porque mais próxima e não a correta? Bem, observe as linhas em negrito e lembre-se que se existirem dois maiores salários, os dois devem ser mostrados. Vejam que existe empate do que  questão pede, que é o “segundo maior salário” entre diversos empregados. 

O row_number() não leva em consideração empate, então, não é a melhor função pra resolver o problema. Observe:

E o que o select traz pra gente?

Ele trouxe corretamente o que foi proposto sintaticamente falando: as segundas linhas (já que existe ordernação do maior salário ao menor) de cada deparmento. Mas os nossos amigos negritados não apareceram por completo devido ao empate, logo, row_number (em tradução simples, número da linha) não atende o desafio proposto.

NTILE() é uma cláusula que não serve também para resolver o desafio de forma simples. Não vou realizar o exemplo pro post não ficar muito grande.

Agora sim, temos RANK e DENSE_RANK que fazem exatamente o que o exerício pede, porém com uma sutil diferença… Vamos utilizar a mesma lógica de particionamento por departamento e ordenação por salário…

Olha o resultado:

É exatamente o que estamos precisando! Se formos realizar uma consulta filtrando as colunas “RANK” ou “RANK_DENSE” (usando uma CTE, foi a forma mais intuitiva que achei) ele trará o resultado correto da resposta. Porém, como disse antes, existe uma diferença sutil que faz a diferença entre “O certo” e o “O mais certo”. Não fez muito sentido o que eu disse? É justamente a palavra DENSE do rank. Se tivesse ali entre os dados DOIS “primeiros lugares” (sim amigos, um empate em um departamento dos primeiros maiores salários) o resultado certamente sairia diferente! Isso considerando dois, imagina três ou quatro…. Pra ilustrar melhor o que eu disse, vamos aos scripts:

Fazendo o teste…

Olha só o resultado!

Observe os empregados “S Martin” e “J Garcia”. Eles possuem os segundos maiores salários de seus departamentos, mas comparando os números de RANK() e DENSE_RANK() obtemos resultados diferentes entre si. A razão pra isso é muito simples: RANK() classificou em primeiro lugar dois itens. Como é natureza dessa função considerar os itens que estão agrupados em certa classificação, os teoricamente “segundo colocados” na verdade estão em terceiros, já que houve um empate entre os dois primeiros (então, como não foi dado nenhum outro critério de desempate, os dois ocupam o mesmo rank porém “tiram” a vaga dos próximos que virão).
DENSE_RANK() não faz isso. Ele considera uma classificação consecultiva, sem pular posições (por isso é “denso”).
Logo, a resposta mais correta seria o código abaixo utilizando dense_rank():

Resultado:

Pra ficar bonito o código sem esse rank_dense, você pode tirá-lo do SELECT pra ficar idêntico a resposta desejada. Deixei ele aqui só pra mostrar que era isso o que a questão queria: os segundos maiores salários de cada departamento, segundo que se houver empate entre os “segundo maior”, que todos os envolvidos sejam listados.

A resposta completa já estava no outro post neste link  aqui. Pra mim, a explicação daquele código já é suficiente para entender um pouco do problema, mas eu queria explorá-lo mais e pra isso, fiz o post.

Você conseguiu encontrar a solução? Utilizou outra forma? Fique a vontade para comentar. Agora vou dormir porque o dia é longo 🙂

Desafio #1 T-SQL

Divagação sobre momento + desafio TSQL

Bom dia!

Vi no blog do Vitor Fava (http://vfava.wordpress.com/) uma recomendação de sites com desafios de T-SQL.
Perfeita ocasião pra voltar a dar mais uma revisada na codagem!
Decidi então trazer alguns deles pra cá por dois motivos:

1) Incentivar você, leitor (se tiver afim é claro) de praticar (e reforçar o que você já sabe);
2) Transmitir uma forma de pensar diferente ou nova de lógica;

O crédito pelas questões é do site http://beyondrelational.com/, que é bem legal, e recomendo, pra quem curte desafios que visite sem medo de ser feliz (a não ser que você já seja um coder-monster, aí no caso você iria só pra brincar mesmo).

Toda semana, por períodos irregulares, irei trazer os desafios que eu acho interessante e postar aqui.
Quem quiser postar uma solução, pode fazê-lo no site ou aqui mesmo, pra gente compartilhar pontos de vista diferentes. Eu postarei a minha solução comentada sobre o exercício em outro  post pra não alongar esse aqui demais. Provavelmente esse final de semana! Já tá pronto aqui, só aguardando a oportunidade 🙂

Vamos ao enunciado:

Link da questão original: http://beyondrelational.com/modules/19/tsql-beginners/297/tsql-beginners-challenge-1-find-the-second-highest-salary-for-each-department.aspx?tab=info

Enunciado: O desafio é listar os funcionários com o segundo maior salário de cada departamento. Se dois funcionários tiverem o mesmo salário, você precisa listá-los também!

Regra: Sua solução deve funcionar no SQL Server 2005 ou superior, e a ordernação deve ser feita pelo salário.

Restrição: A solução deve ser apresentada em apenas uma consulta que comece com WITH ou SELECT. Ou seja, pode usar CTE? Pode tio(a). Pode usar tabela temporária, etc? Não tio(a), não pode.

Dados de amostra

Resultado esperado

Código da amostra:

Algumas dicas pra quem se sentir perdido (só leia isso se sentir bastante dificuldade):

1) Usar CTE (Common Table Expressions) é a forma mais fácil de fazer, na minha opinião;

2) Dê uma olhada nas Windows Functions, são o santo graal pra Ad-hoc Queries e vai resolver fácil essa questão .

3) Não veja a solução no site (existe a mesma disponível lá na aba solutions). Tente fazer pra aprender . Não é nada complexo e não exige muita leitura.

A solução será postada em outro post com explicações (farei isso final de semana ou na segunda). Se quiser ver a resposta (de novo, não recomendo) que ainda não tem as explicações mais atenciosas que farei na próxima postagem, clique aqui!

Até mais!