quinta-feira, 29 de novembro de 2012

USANDO COLUNAS COMPUTADAS (USING COMPUTED COLUMNS)

Em algumas bases de dados, alguns valores que foram calculados, muitas vezes geram diversos relatórios. Também existem algumas colunas que são dependentes de uma ou mais colunas. Quando uma coluna é atualizada, usa-se gatilhos ​​para sincronizar os novos valores em colunas dependentes. É necessária a utilização de um meio mais eficiente e padronizado para lidar com esses tipos de cenários. Então como é possível se livrar da sobrecarga de cálculos em tempo de geração de relatórios e como  evitar o uso de gatilhos para a sincronização de colunas atualizadas?

Solução:
Para esses cenários onde os valores calculados são necessárias ou valores são gerados através de manipulação em outras colunas, temos um poderoso recurso previsto no SQL Server. Este recurso é o de "Colunas computadas".

Uma coluna computada é calculada a partir de uma expressão que pode usar outra coluna ou colunas na mesma tabela. Funções, variáveis​​, constantes, nomes de colunas não computadas ou qualquer combinação de todos estes podem ser usados ​​junto com as operadoras para criar uma coluna computada.

Nesta dica, vamos percorrer um exemplo de implementação de uma coluna computada.

Vamos testar scripts em SQL Server 2005 e SQL Server 2008. No script a seguir será criada uma tabela chamada CCtest no banco de dados AdventureWorks com três colunas [empNumb], [DOBirth], [DORetirement].

Anexando o AdventureWorks baixado da Microsoft


USE [master]
GO
CREATE DATABASE [AdventureWorks2012] ON 
( FILENAME = N'D:\MSSQL\Data\AdventureWorks2012_Data.mdf' ),
( FILENAME = N'D:\MSSQL\Data\AdventureWorks2012_log.ldf' )
 FOR ATTACH
GO

Somos obrigados a ter a "Data de Aposentadoria" ([DORetirement]) para cada funcionário como (DOBirth + 60 anos - 1 dia). Em vez de calcular a cada vez que é chamado um relatório ou atualizar a coluna [DORetirement], executar um gatilho para quando o [DOBirth] é atualizado, temos uma melhor abordagem aqui criando [DORetirement] como uma coluna computada. Desde que esta regra pode ser mudada a qualquer momento estamos implementando-a como uma coluna computada em vez de um valor codificado.


USE [AdventureWorks2012] 
GO 
CREATE TABLE [dbo].[CCtest]
(
[empNumb] [int] NULL,
[DOBirth] [datetime] NULL,
[DORetirement] AS (dateadd(year,(60),[DOBirth])-(1)) PERSISTED
)
GO

Existe a possibilidade de criar a mesma tabela utilizando o SSMS, mas é muito bom manter em mente os códigos. Vamos prosseguir desta forma.


Agora temos o nosso CCtest tabela com uma coluna computada. Da mesma forma, podemos adicionar uma coluna computada a qualquer tabela existente usando o "ALTER TABLE" comando ou abrir a tabela no modo de design usando SSMS e fazer as alterações.

Vamos inserir alguns dados e executar uma consulta para testar a funcionalidade da coluna computada.


USE AdventureWorks2012
GO
INSERT INTO CCTest (empNumb, DOBirth)
SELECT 30, '1985-12-13'  UNION ALL
SELECT 25, '1980-11-18 ' UNION ALL
SELECT 21, '1978-01-19 ' UNION ALL
SELECT 7, '1985-12-13 ' UNION ALL
SELECT 5, '1975-07-23 '
GO
SELECT * FROM dbo.CCTest
GO



Para verificar se a coluna computada será atualizado para quaisquer atualizações, vamos atualizar [DOBirth] para [empNumb] 25.


UPDATE CCtest
SET DOBirth = '1960-03-25'
WHERE empnumb = 25
GO
SELECT * FROM dbo.CCTest
WHERE Empnumb = 25
GO



Persistência (PERSISTED)
Você deve ter notado que nós também usamos a propriedade "persisted" para a nossa coluna computada. Esta propriedade para colunas computadas foi introduzido no SQL Server 2005 e em diante. É importante para qualquer coluna computada, pois muitas características adicionais dependem dele. Para ser capaz de fazer uma coluna computada como persistentes que tem que ser determinista.

Aqui estão algumas regras:

  • Se a propriedade PERSISTED não foi configurada então coluna calculada será apenas uma coluna virtual. Não há dados para esta coluna serão armazenados no disco e os valores serão calculados a cada momento que for referenciado em um script. Se esta propriedade é definida como ativa então os dados de coluna computada serão armazenados no disco, aumenta-se o espaço em disco, porém diminui a necessidade de processamento do servidor.
  • Qualquer atualização na coluna referenciada serão sincronizadas automaticamente na coluna computada se é ela persistente.
  • Junto com algumas outras condições em PERSISTED são necessárias para criar um índice na coluna computada.

Nulidade(Nullibility)
Nullibility para um valor de coluna calculada será determinada pelo Engine do SQL em si. O resultado de uma coluna NOT NULL referenciado pode ser NULL em determinadas condições para evitar possíveis erros de excessão ou sobrecargas. É possível proporcionar um valor alternativo para NULL utilizando o ISNULL (check_expression, constante), se necessário.

Algumas limitações

  • Para o SQL Server 2000 você não pode criar uma coluna computada persistente.
  • Você não pode fazer referência a colunas de outras tabelas para uma expressão de coluna computada.
  • Você não pode inserir ou atualizar declarações em colunas computadas.
  • Se você estiver combinando operadores de dois tipos diferentes de dados em sua expressão então o operador de menor precedência será convertido para o de maior precedência. Se a conversão implícita não for possível, então erro será gerado.
  • Uma subconsulta não pode ser usado como uma expressão para criar uma coluna computada.
  • As colunas computadas podem ser utilizadas em  SELECT, WHERE ou ORDER BY  e como expressões regulares, mas para usar uma coluna computada como chave CHECK, estrangeiros ou não restrições NULL você tem que configurá-lo para PERSISTED.
  • Para usar uma coluna computada como PRIMARY ou UNIQUE KEYdeve ser definido por uma expressão determinística e tipo de dados de expressão de coluna computada deve ser indexável.

Próximos Passos

  • Durante o planejamento para qualquer coluna computada, por favor, tenha em mente que, apesar de uma coluna computada persistente irá reduzir a sobrecarga para os cálculos em tempo de execução ele vai consumir mais espaço em disco.
  • Para obter nulidade de qualquer coluna computada em uma tabela, use a função COLUMNPROPERTY com a propriedade AllowsNull.
  • Criando índices em colunas computadas requer certas condições para ser cumprida. Para mais detalhes sobre essas condições visite BOL (Books On Line)
Como sempre, não quero esgotar o assunto aqui, mas comentários e sugestões são bem vindas.

Até o próximo post!

sábado, 24 de novembro de 2012

TRATAMENTO DE NULL (NULL IN FIELDS)


Uma query  (SELECT) retorna do banco de dados todas as linhas para as quais a cláusula WHERE retorna True (verdadeiro). Muitos desenvolvedores se confundem assumindo que a consulta retornará todos os registros para os quais a cláusula WHERE retorne qualquer valor diferente de False (Falso). Isto é uma causa comum de relatórios incompletos.

Para explicar a razão, considere que a linguagem SQL usa uma lógica de três valores: True, False e Null (Nulo). Qualquer valor Null em uma expressão torna toda a expressão Null (com algumas exceções citadas abaixo).

Exemplo: O senso comum sugere que o SELECT abaixo retorne todas as linhas em uma tabela:

SELECT * FROM Pedidos WHERE (total < 1000 Or total >= 1000)

O SELECT não incluirá os registros para os quais o campo Total é Null, porque este valor faz com que toda a expressão contida na cláusula WHERE seja avaliada como Null.

SELECT * FROM Pedidos WHERE Total = 0

A consulta acima retorna todos os pedidos para os quais Total é zero, mas não aqueles para os quais o Total é Null. Se você quer incluir estes últimos, precisa pesquisar explicitamente pelos valores Null:

SELECT * FROM Pedidos WHERE total = 0 OR total IS NULL

ISNULL é uma função  T-SQL que é constantemente usada para lidar com valores Null. Simplesmente, ela sempre retorna o seu primeiro argumento exceto quando ele é Null (neste caso ela retorna o segundo argumento). Veja como você pode reescrever a consulta acima para lidar com valores Null:

-- converte valores Null para zero antes de compará-los
SELECT * FROM Pedidos WHERE ISNULL(total, 0) = 0 

Além disto, a T-SQL estende o padrão ANSI 92 e suporta Null também em cláusulas IN, de modo que você pode reescrever a consulta acima como abaixo:

SELECT * FROM Pedidos WHERE total IN (0, NULL)

Podemos, também, fazer a consulta inversa, procurando na tabela todos os registros cujo campo especificado seja diferente de Null.

SELECT * FROM Pedidos WHERE total IS NOT NULL

Agora, imagine se você quiser usar o comando CASE para testar os resultados com valor Null.

x
1
2
NULL
4
5

Este seria o método de entendimento direto de como fazer:


SELECT x,CASE x
WHEN NULL THEN ‘sim’
ELSE ‘nao’
END AS resultado
FROM Tabela


O resultado esperado seria:

x resultado
1 nao
2 nao
NULL sim
4 nao
5 nao

Mas ao invés disto teremos exatamente esse resultado:

x resultado
1 nao
2 nao
NULL nao
4 nao
5 nao

Mas então, porque não funcionou? Eu respondo:
NULL é desconhecido, NULL não é igual a NULL, e NULL é a "coisa" mais estranha que pode existir num banco de dados, comum sim, normal não.


Este seria o código exato:

SELECT x,
CASE
WHEN x IS NULL THEN ‘sim’
ELSE ‘nao’
END AS resultado
FROM Tabela



Espero que tirem proveito deste conhecimento. Até mais!


terça-feira, 20 de novembro de 2012

Campo de CNPJ usando notação científica (Scientific Notation for largue numbers)


Já tive vários problemas em realizar consultas em banco de dados com campo de CNPJ que gerassem outras tabelas, ou para relatório ou para concatenação de dados.
Não vou postar aqui hoje as telas, mas apenas o código que utilizei para resolver o problema.



SELECT CAST(CAST(CNPJ AS NUMERIC) AS NVARCHAR(15)) FROM TABELA_DADOS

A idéia aqui é Mudar o formato do campo para NUMERIC, deixando ele assim em “plain text” e depois Mudar novamente para NVARCHAR(15) para ficar texto. Eu sei que campos de CNPJ só tem 14 digitos, porém por segurança, sempre ponho esse byte a mais. Padrão meu, para os bancos de dados que tenho trabalhado esse byte “a mais” não tem afetado desempenho e nem feito aumentar de modo significativo meu banco de dados.

Assim que eu tiver algumas telas para exemplificar, eu posto…
sqlserver_sql_server_2008_logo

sábado, 17 de novembro de 2012

Primeiro contato com SCRUM (Knowing Scrum)


Scrum é uma metodologia ágil para gestão e planejamento de projetos de software. Se você chegou até aqui interessado em fazer uma das certificações disponíveis para Scrum, veja por que dizemos não à certificação?
No Scrum, os projetos são dividos em ciclos (tipicamente mensais) chamados deSprints. O Sprint representa um Time Box dentro do qual um conjunto de atividades deve ser executado. Metodologias ágeis de desenvolvimento de software são iterativas, ou seja, o trabalho é dividido em iterações, que são chamadas de Sprints no caso do Scrum.
As funcionalidades a serem implementadas em um projeto são mantidas em uma lista que é conhecida como Product Backlog. No início de cada Sprint, faz-se um Sprint Planning Meeting, ou seja, uma reunião de planejamento na qual o Product Ownerprioriza os itens do Product Backlog e a equipe seleciona as atividades que ela será capaz de implementar durante o Sprint que se inicia. As tarefas alocadas em um Sprint são transferidas do Product Backlog para o Sprint Backlog.
A cada dia de uma Sprint, a equipe faz uma breve reunião (normalmente de manhã), chamada Daily Scrum. O objetivo é disseminar conhecimento sobre o que foi feito no dia anterior, identificar impedimentos e priorizar o trabalho do dia que se inicia.
Ao final de um Sprint, a equipe apresenta as funcionalidades implementadas em umaSprint Review Meeting. Finalmente, faz-se uma Sprint Retrospective e a equipe parte para o planejamento do próximo Sprint. Assim reinicia-se o ciclo. Veja a ilustração abaixo:


Resolvendo fazer o curso, eu recomendo o site http://tiexames.com.br/curso_Scrum_Master.php

Site Oficial: http://www.scrum.org/assessments/

Otimizar a comunicação entre áreas com o BPM é o segredo de uma gestão saudável (Optimizing follow-up with BMP)


Em entrevista recentemente compartilhada neste link, Cassiana Bovo, especialista em gestão da qualidade estratégica e consultora empresarial, falou sobre a importância do Mapeamento de Processos na busca pela melhoria contínua das atividades executadas pelas empresas. Ela ressaltou que as empresas geralmente buscam o Mapeamento de Processos quando estão com sérios problemas de comunicação e que com a implantação da metodologia esses problemas podem ser evitados.
Segundo Cassiana, as palavras comunicação e informatização têm sido nos últimos anos foco do mundo empresarial. “Os empresários, buscando otimizar a produtividade, encontram na informatização um meio de controlar, monitorar e agilizar o processo produtivo, seja ele no meio industrial, varejo e atacado ou serviços”, comenta a consultora.
Atualmente a utilização de ferramentas BPM e de metodologias que agregam facilidades à sua implantação, como o Mapeamento de Processos, por exemplo, são alternativas que as empresas buscam a fim de otimizar seu trabalho e, a partir de um processo de melhoria contínua, alcançar bons resultados. “Uma tendência, que já é realidade nas grandes corporações, e está se tornando acessível às pequenas e médias empresas, é a implantação do Mapeamento de Processos (BPM) como ferramenta para reduzir as falhas de comunicação entre as diversas áreas das empresas”, explica Cassiana.
De acordo com a especialista em gestão da qualidade, a utilização de uma ferramenta BPM deve estar intimamente ligada ao planejamento estratégico das empresas, para que possa ser efetiva na busca pela melhoria contínua dos processos realizados. “A adoção do BPM traz resultados significativos no tangente aos níveis tático e estratégico das organizações, independente de seu porte, pois roteiriza o caminho a ser percorrido (do processo), facilita o controle e monitoramento dos processos através de indicadores, promove a rápida detecção de não conformidades e melhorias reduzindo custos administrativos e produtivos, evita que as informações se percam durante a realização das atividades da empresa e promove uma fácil visualização das responsabilidades e atribuições de cada setor”, completa.
“O mapeamento de processos (BPM), por seus diversos benefícios, proporciona uma melhor organização e sistematização das atividades da empresa, assim como melhora a comunicação entre os indivíduos e setores, propiciando um ambiente favorável para uma gestão saudável e a obtenção de bons resultados”, finaliza Cassiana.
Saiba mais sobre Cassiana Bovo: Administradora, Consultora Empresarial e da Qualidade, Especialista em Gestão Estratégica e Qualidade, Cassiana Bovo é sócia da 3DK Comunicação e Consultoria; e Diretora de Negócios do Empresas S/A.

Crie cenários de redes mais complexas com o simulador GNS3 (Create a complex network with a simulator)


Todos conhecem o Packet Tracer, que na minha opinião é um excelente simulador e deve ser utilizado por todos aqueles que estão começando seus estudos ou se preparando para o exame do CCNA. No entanto, para aqueles que estão estudando para um nível mais avançado o Packet Tracer não atende a todas as necessidades, pois cenários de redes mais complexas não podem ser criados no Packet Tracer.
Então, se você está estudando para algum exame Cisco depois do CCNA quais caminhos pode tomar:
  1. Montar um lab próprio, com equipamentos reais, em sua casa. Para aqueles que possuem uma boa situação financeira até pode ser um bom caminho, mas no final o custo acaba não sendo nada barato.
  2. Procurar por empresas que aluguem laboratórios para estudo. Essa pode ser uma tarefa dificil, pois aqui no Brasil esse tipo de serviço não é muito comum, além da incoveniência de ter que estudar com hora marcada e tempo de acesso limitado.
  3. Essa é a minha preferida – utilizar o simulador de redes GNS3.

Mas o que é o GNS3?

O simulador GNS3 é um software grátis (isso mesmo, grátis), open source, e que pode ser baixado e utilizado livremente. O GNS3 funciona com imagens IOS da Cisco reais, que são emuladas através de um programa chamado Dynamips. Podemos dizer que o GNS3 é a interface gráfica para o Dynamips, que é o programa que faz todo o trabalho pesado de emular os equipamentos utilizando IOS reais da Cisco.
Com sua interface gráfica intuitiva e bem fácil de se utilizar o GNS3 se mostra como uma poderosa ferramenta, capaz de emular redes complexas e que pode ser utilizada por todos aqueles que estejam em busca de uma certificação avançada da Cisco.

O que podemos fazer com o GNS3

De acordo com o website do GNS3 veja algumas das características desse poderoso simulador:
  • Design de topologias de redes complexas
  • Emulação de muitas plataformas de roteadores Cisco router e PIX firewall
  • Simulação de switches ethernet simples, ATM e Frame Relay
  • Conexão da rede simulado com o mundo real
  • Captura de pacotes utilizando o Wireshark

Plataformas Suportadas pelo GNS3

Na lista a seguir, citamos algumas das plataformas atualmente suportadas pelo GNS3. Como você pode notar, podemos utilizar uma grande quantidade de equipamentos para construir topologias complexas com o GNS3.
  • 1710, 1720, 1721, 1750, 1751, 1760
  • 2610, 2610XM, 2611, 2611XM, 2620, 2620XM, 2621, 2621XM, 2650XM, 2651XM, 2691
  • 3620, 3640, 3660, 3725, 3745
  • 7200

Utilizando o Simulador de Redes GNS3

Abaixo mostramos algumas telas do GNS3, apenas para vocês terem uma breve idéia de como é essa ferramenta.
Essa primeira figura mostra a tela inicial do programa. No lado esquerdo da tela temos todos os equipamentos que poderão ser utilizados. Basta clicar e arrastar para área principal central, onde a topologia será construida.
Abaixo temos um breve exemplo de uma topologia com 3 roteadores em uma rede Frame-Relay.
Por último mostramos um saída do comando show run em um dos roteadores.

Considerações Finais

Como podemos notar é possível fazer muita coisa com o GNS3. Você será capaz de montar topologias diversas, com diferentes níveis de complexidade e com as características necessárias para o exame de certificação específico que estiver estudando.
Mas como tudo na vida, temos o lado bom e o lado ruim. Um dos principais pontos negativos é que você irá precisar de IOS Cisco reais. O GNS3 não vem com imagens IOS embutidas no simulador, ou seja, você deverá ter disponível os IOS que irá utilizar e informar o caminho da pasta para o GNS3, caso contrário o simulador não irá funcionar.
Para baixar essas imagens diretamente do site da Cisco você deverá possuir uma conta CCO. É claro que existem outras fontes de onde conseguir imagens IOS da Cisco, mas definitivamente nós não recomendamos essa alternativa. O recomendado é que você realmente utilize imagens IOS baixadas diretamente da Cisco.
Outro ponto importante é a quantidade de recurso de CPU e memória RAM consumidos ao se utilizar GNS3. Quanto mais complexa a topologia montada, maior quantidade de memória e CPU será consumida. Portanto, saiba que para rodar esse simulador será necessário um computador com uma certa robustez.
Portanto é isso aí… utilizem que vale a pena! E em breve vamos postar mais artigos sobre o GNS3 e algumas de suas facilidades.
Fonte: Blog da DlteC

sexta-feira, 16 de novembro de 2012

Conhecendo o LUA (Knowing LUA, The programming language)

Conversando com um colega programador, grande Danilo Nader, que me indicou conhecer algo do LUA (http://www.lua.org).
Lua é inteiramente projetada, implementada e desenvolvida no Brasil, por uma equipe na PUC-Rio(Pontifícia Universidade Católica do Rio de Janeiro)

A linguagem conta com ambiente em Shell Script, tem para Windows e Linux.
Pode-se utilizar, inclusive a versão de Framework para WEB, o Orbit (http://keplerproject.github.com/orbit/).

Uma utilização bem aplicável é para dispositivos móveis. Ela interagem bem com o Java e o C#.

Vamos dar continuidade nos estudos, e tão logo tenhamos algum tutorial, será postado e comentado.

Até lá, (no Lua eh claro...)

quinta-feira, 15 de novembro de 2012

Renomeando Colunas e Tabelas (How to Rename a Column Name or Table Name)

Vamos usar o comando sp_rename (Transact-SQL)

Observações:

Altera o nome de um objeto criado pelo usuário no banco de dados atual.  Esse objeto pode ser uma tabela, índice, coluna, tipo de dados de alias ou tipo de dados CLR definido pelo usuário do Microsoft .NET Framework Common Language Runtime.

Sintaxe:

sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object_type' ]

Exemplos:

A.Renomeando uma tabela


O exemplo a seguir renomeia a tabela SalesTerritory como SalesTerr no esquema Sales.
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory', 'SalesTerr';
GO

B.Renomeando uma coluna

O exemplo a seguir renomeia a coluna TerritoryID na tabela SalesTerritory como TerrID.
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
GO

C.Renomeando um índice

O exemplo a seguir renomeia o índice IX_ProductVendor_VendorID como IX_VendorID.
USE AdventureWorks2012;
GO
EXEC sp_rename N'Purchasing.ProductVendor.IX_ProductVendor_VendorID', N'IX_VendorID', N'INDEX';
GO
          

D.Renomeando um tipo de dados de alias

O exemplo a seguir renomeia o tipo de dados de alias Phone como Telephone.
USE AdventureWorks2012;
GO
EXEC sp_rename N'Phone', N'Telephone', N'USERDATATYPE'; 
GO
            


Observações Importantes:


Você só pode alterar o nome de um objeto ou tipo de dados no banco de dados atual. Os nomes da maioria dos tipos de dados do sistema e objetos do sistema não podem ser alterados.

sp_rename renomeia automaticamente o índice associado sempre que uma restrição PRIMARY KEY ou UNIQUE é renomeada. Se um índice renomeado for vinculado a uma restrição PRIMARY KEY, a restrição PRIMARY KEY também será renomeada automaticamente por sp_rename.

sp_rename pode ser usado para renomear índices XML primários e secundários.

Renomear um STORE PROICEDURE, FUCNTION, VIEW ou TRIGGER não alterará o nome do objeto correspondente na coluna definition da exibição de catálogo sys.sql_modules. Portanto, é recomendável que sp_rename não seja usado para renomear esses tipos de objetos. Em vez disso, cancele e recrie o objeto com o nome novo.

A renomeação de um objeto, como uma tabela ou coluna, não renomeará automaticamente as referências a esse objeto. É necessário modificar manualmente todos os objetos que fazem referência ao objeto renomeado. Por exemplo, se você renomear uma coluna de tabela e aquela coluna for referenciada em uma TRIGGER, será necessário modificar a TRIGGER para que ele reflita o nome novo da coluna. Use sys.sql_expression_dependencies para listar dependências no objeto antes de renomeá-lo.

quarta-feira, 14 de novembro de 2012

Licenciando o SQL Server 2012 (Licence in SQL SERVER 2012)

O SQL Server 2012 é muito mais do que um SGBD (sistema de gerenciamento de banco de dados) hoje ele é uma plataforma de dados e informação pronta!!!
Com isso o SQL Server 2012 traz três principais pilares: 
·         Missão Crítica:
Provando a robustez do SQL Server para trabalhar em ambientes de missão crítica, considerando performance , alta disponibilidade e segurança umas das principais inovações são: AlwaysOn e ColumnStore Index.
·         Breakthrough Insight:
Inovando com uma solução de BI que é para todos dentro da organização e permitindo através de poderosas ferramentas o acesso aos dados em qualquer lugas a qualquer hora e no formato correto, dentro deste pilar temos grandes inovações para a exploração e descoberta de dados com o PowerView e o PowerPivot.
Além de toda a parte de gerenciamento e disseminação dos dados com o SharePoint e agora através de um único modelo semântico de dados temos o BI Semantic Model.
·         Cloud On Your Terms:
Dentro deste pilar vc encontra a flexibilidade de estender soluções desenvolvidas em casa até datacenter ou cloud e ainda aumentar a sua produtividade com o SQL Server Data Tools que lhe permitirá desenvolver uma única vez e executar em qualquer lugar, vale a pena tb ressaltar a flexibilidade de sincronização dos dados de casa com dados que estaja na nuvem através do Data Sync permitindo trabalhar ambientes híbridos.
O SQL Server 2012 será comercializado em três edições principais:

 SQL SERVER 2012 ENTERPRISE

As funcionalidades da antiga edição SQL Server 2008 R2 Datacenter estão disponíveis nesta, todas as features de BI, alta disponibilidade, segurança e performance, é a edição mais parruda, ou seja, tem todas as funcionalidades que o produto possui.

SQL SERVER 2012 BUSINESS INTELLIGENCE

Nova versão do produto contempla todas as features de BI incluindo a rápida descoberta e exploração de dados com o PowerView e o BI Semantic Model.

SQL SERVER 2012 STANDARD

Funcionalidades básicas de Database e BI, é indicada apenas para cenários departamentais

URL Amigável usando mod_rewrite e PHP (Friendly URL and PHP)

Tags: URL, amigável, .htaccess, Apache, mod_rewrite, RegEx

Semana passada busquei, estudei e encontrei um maneira legal para trabalhar com URL-amigável, retirar os benditos parametros estranhos (?s=1&m=2) da URL e colocar algo mais amigável para os indexadores de pesquisa e memorização do leitor. O artigo a seguir é para tranformar links assim http://www.site.com.br/processador.php?s=secao&m=materia em links assim http://www.site.com.br/secao/materia.html, "bunitinho" né ;).

Primeiro de tudo veja se estar ativo o Módulo mod_rewrite no Apache no httpd.conf, feito isto na raiz do site crie um arquivo .htaccess com um editor de texto tipo notepad e adicione a informação abaixo:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^([a-zA-Z]*)\/([a-zA-Z]*)\.html$ /unideia/processador.php?s=$1&m=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /unideia/processador.php?s=ERRO&u=$1 [L,QSA]
</IfModule>

Agora comentarei linha a linha as informações do .htaccess

-- EXECUTA O QUE ESTIVER DENTRO DO IF SE O MÓDULO FOR ENCONTRADO
<IfModule mod_rewrite.c>
-- ATIVA A REESCRITA PARA ESTA PASTA
RewriteEngine On
-- DESATIVA A REESCRITA PARA ARQUIVOS
RewriteCond %{REQUEST_FILENAME} !-f
-- DESATIVA A REESCRITA PARA PASTAS
RewriteCond %{REQUEST_FILENAME} !-d
-- DESATIVA A REESCRITAS PARA LINKS
RewriteCond %{REQUEST_FILENAME} !-l
-- CRIA A REGRA VIA REGEX PARA A ESCRITA, OU SEJA NA URL http://www.site.com.br/secao/materia.html ELE CHAMARA O ARQUIVO PROCESSADOR.PHP PASSANDO COMO PARAMETROS **GET** S=SECAO E M=MATERIA
RewriteRule ^([a-zA-Z]*)\/([a-zA-Z]*)\.html$ /processador.php?s=$1&m=$2 [L,QSA]

-- AGORA A GRANDE SACADA (POR GENTILEZA, SE ALGUEM TEVE UMA IDÉIA MELHOR SOU TODO OUVIDOS), CASO ALGUEM TENTE FORÇAR ALGO, OU DIGITE UMA URL ERRADA ELE TRATA ISSO TAMBEM

-- DESATIVA A REESCRITA PARA ARQUIVOS
RewriteCond %{REQUEST_FILENAME} !-f
-- DESATIVA A REESCRITA PARA PASTAS
RewriteCond %{REQUEST_FILENAME} !-d
-- DESATIVA A REESCRITAS PARA LINKS
RewriteCond %{REQUEST_FILENAME} !-l
-- CRIA A REGRA VIA REGEX PARA A ESCRITA, OU SEJA NA URL http://www.site.com.br/?i=1&s=1 ELE CHAMARA O ARQUIVO PROCESSADOR.PHP PASSANDO COMO PARAMETROS **GET** E=ERRO E U=?i=1&s=1
RewriteRule ^(.*)$ /processador.php?e=ERRO&u=$1 [L,QSA]
</IfModule>

Pronto, agora é só criar um arquivo processador.php para tratar os parametros recebidos e chamar os arquivos corretos.

Espero ter ajudado, qualquer dúvida ou sugestão deixe seu comentário.

terça-feira, 13 de novembro de 2012

Pequena coleção de DBCC (A Small Collection of Useful DBCC Commands)


-- A Small Collection of Useful DBCC Commands
-- Glenn Berry
-- August 2010
-- http://glennberrysqlperformance.spaces.live.com/
-- Twitter: GlennAlanBerry

-- Clears out contents of buffer cache
-- Use caution before doing this on a production system!
DBCC DROPCLEANBUFFERS;

-- Clears procedure cache on entire SQL instance
DBCC FREEPROCCACHE;

-- Remove the specific plan from the cache using the plan handle
DBCC FREEPROCCACHE (0x060006001ECA270EC0215D05000000000000000000000000);

-- Clear ad-hoc SQL plans for entire SQL instance
DBCC FREESYSTEMCACHE('SQL Plans'); 

-- Clears TokenAndPermUserStore cache on entire SQL instance
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore');

-- Releases all unused cache entries from all caches. ALL specifies all supported caches
-- Asynchronously frees currently used entries from their respective caches after they become unused
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

-- Determine the id of the current database
-- and flush the procedure cache for only that database
DECLARE @intDBID AS INT = (SELECT DB_ID());
DBCC FLUSHPROCINDB (@intDBID);

-- Clear Wait Stats for entire instance
DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR);

-- Get VLF count for transaction log for the current database,
-- number of rows equals VLF count. Lower is better!
DBCC LOGINFO;

-- Returns lots of useful information about memory usage
DBCC MEMORYSTATUS;

-- Find oldest open transaction
DBCC OPENTRAN;

-- Get input buffer for a SPID
DBCC INPUTBUFFER(21);

-- Check trace status for instance
DBCC TRACESTATUS(-1)

Usuário órfão no SQL (How to fix orphaned SQL Server users)


Depois de um bom tempo tentando resolver problemas de usuários órfãos após backups, migração de bancos, log shipping, mirroring e outras ocorrências, pude verificar em diversos blogs e artigos na internet algumas formas de resolver este problema, mas não vi formas de evitar que ele aconteça… O que me deixou impressionado, pois o problema é bem mais simples do que parece (depois que você descobre como funciona, realmente parece simples).
Um exemplo comum de usuário órfão:
Usuário Órfão
Solução para o problema:
Para quem chegou a este artigo procurando solucionar um problema de usuários órfãos, você possui várias alternativas:
No SQL Server 2000 e SQL Server 2005:
1-- Associando a um login existente:
2EXEC sp_change_users_login 'Update_One''nome do usuário''nome do login'

1--Associando a um login existente com o mesmo nome do usuário,
2--Ou se não existir login com o mesmo nome do usuário, criar um com a senha informada:
3EXEC sp_change_users_login 'Auto_Fix''nome do usuário'NULL'senha'
A partir do SQL Server 2005 e SQL Server 2008:
1-- Associando a um login existente:
2ALTER USER [nome do usuario] WITH LOGIN = [nome do login]
Agora vamos saber por que isso ocorre:
Os usuários do banco de dados são associados a um código de segurança (SID) dos logins da instância do banco de dados, mas como este SID pode ser aleatório na criação dos logins, o fato de você possuir um login com mesmo nome em duas instâncias do SQL Server distintas, não quer dizer eles são iguais, pois quando o SQL Server tenta restaurar um banco de dados de outra instância, ele só consegue identificar os logins “pais” de seus usuários pelo SID.
Mas se eu forçar um SID para o meu login nas instâncias do SQL Server, será que ainda vou ter o problema? Então vamos conferir:
Utilizei a seguinte consulta para recuperar o SID de um determinado login:
1SELECT name, sid FROM sys.server_principals WHERE type = 'S'
SELECT name, sid FROM sys.server_principals WHERE type = 'S'
Em outro SQL Server, vou criar um login com mesmo SID:
1CREATE LOGIN paulo
2WITH PASSWORD 'p@$$w0rd',
3SID = 0x0F5AE6C15103B647A7BD41F744C256F3
Após restaurar o banco de dados neste outro servidor, como resultado, sem usuário órfão!
Usuário Adotado
E se você tiver um login com nome diferente do login da outra instância, mas com um mesmo SID, o SQL Server ainda utilizará o SID como critério para associar os usuários aos seus respectivos logins, exemplo:
Usuário Estranhamente Adotado
Então, criar logins com SIDs iguais entre instâncias do SQL Server, evitará que problemas de usuários órfãos ocorram novamente, seja por backups, migração de bancos, log shipping e mirroring! A partir de agora, só diversão!