Novidades SQL Server 2008 – Declarative Management Framework
Um dos grandes sonhos de um DBA é o de manter o padrão de nomenclatura dos objetos, muito difícil de conseguir quando se tem um número razoavel de desenvolvedores.
Agora no SQL Server 2008 isso já é possível utilizando a DMF (Declarative Management Framework) que possibilita a adição de políticas no banco de dados para garantir que determinadas diretrizes sejam seguidas.
Através da DMF não só é possível garantir o padrão de nomenclatura de objetos como também garantir que determinadas opções do banco de dados não sejam alteradas, como por exemplo impedir que a opção autoshrink não seja habilitada.
A DMF baseia-se em três objetos:
- Facets
- Conditions
- Policies
Facets são os objetos que possuem propriedades e que podem ter regras aplicadas sobre as mesmas. Exemplos de Facets são: Stored Procedures, Tables, Trigger, etc… Ao todo são 38 Facets.
Para visualizar todas as Facets, vá até o Management Studio, nó “Management” e expanda o nó “Policy Management” e em seguida “Facets”. Lembrando que as Facets são fixas e não podem ser criadas pelo usuário pois tratam-se de objetos do banco de dados.
Como exemplo, crie uma “Condition” com a expressão @Name LIKE ‘up_%’. botão direito do mouse em “Conditions”, “New Condition”, selecione a Facet “Stored Procedure” e dê um nome a condition, exemplo “Nomenclatura de stored procedure”.
Depois crie uma Policy que vai associar a Facet à Condition criada, para isso clique com o botão direito do mouse em “Policies”, “New Policy”. Em seguida selecione a condition na lista de opções “Check condition” e na opção “Evaluation Mode” selecione “On change: prevent”. Ainda nesta janela, para melhorar, vá até a opção “Description” (ao lado esquerdo superior) e na caixa de texto “Description” digite um texto que será exibido caso a politica seja violada, ou seja, caso tente-se criar uma stored procedure que não atenda a condição implementada, exemplo do texto “ATENÇÃO: Por questões de padronização as tabelas só podem ser criadas utilizando-se o prefixo ‘ut_’.”.
Pronto, à partir de agora é possível manter o padrão de nomenclatura dos objetos do banco de dados.
Novidades SQL Server 2008 – Instrução MERGE
Como certeza uma das maiores novidades do SQL Server 2008 é a instrução MERGE.
Merge significa “fusão”, através desta instrução é possível mesclar os dados de duas tabelas em uma tabela alvo.
Imagine que você tenha duas tabelas, uma com o cadastro de funcionários do seu sistema e outra com um segundo cadastro de funcionários que foi importado de uma planilha em excel, por exemplo.
Pressupondo que a segunda tabela contém os dados mais atuais, e que você deseja inserir na tabela de funcionários do seu sistema os NOVOS registros que estão na segunda tabela, atualizar os registros da tabela funcionários do seu sistema que existem na segunda tabela e por fim excluir registros da tabela funcionários do seu sistema que não existam na segunda tabela, para isso você pode utilizar a instrução MERGE.
Nas versões anteriores do SQL Server, caso você precisasse realizar este tipo de operação, era necessário realizar uma série de verificações, instruções insert, update e delete, agora você pode fazer tudo isso através da instrução MERGE.
Veja o exemplo do código abaixo:
MERGE tb_Funcionario AS FUN USING tb_Funcionario_Novos AS FUN_NOVOS ON FUN.Codigo = FUN_NOVOS.Codigo WHEN MATCHED THEN -- Se o registro existir na tabela alvo, atualizar UPDATE SET Nome = FUN_NOVOS.Nome, Sobrenome = FUN_NOVOS.Sobrenome, Salario = FUN_NOVOS.Salario WHEN NOT MATCHED BY TARGET THEN -- Se o registro não existir na tabela alvo, inserir INSERT (Codigo, Nome, Sobrenome, Salario) VALUES (FUN_NOVOS.Codigo, FUN_NOVOS.Nome, FUN_NOVOS.Sobrenome, FUN_NOVOS.Salario) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, Inserted.*, Deleted.*;
Este código faz exatamente como explicado acima, no final a tabela de funcionários do sistema (tb_Funcionario) ficará atualizada, seja com novos registros, com registros pré-existentes atualizados ou registros antigos removidos, tudo com base na segunda tabela (tb_Funcionario_Novos).
A última linha (código OUTPUT) é opcional, ela retorna:
- A ação que foi realizada (insert, update ou delete)
- Registros com seus valores inseridos/atualizados
- Registros com seus valores excluídos
Com a instrução MERGE é possível, por exemplo, criar uma stored procedure que recebe como parâmetro valores e estes são inseridos (caso não exista) ou atualizados (caso já exista) , sem que você tenha que realizar verificações com IF.
IMPORTANTE: Ao final da instrução MERGE, não esqueça de fechá-la através do ponto-e-vírgula.
Para mais informações sobre a instrução MERGE, consulte o Books online do SQL Server 2008 através do link http://msdn.microsoft.com/en-us/library/bb510625.aspx.
Novidades SQL 2008 – Operadores Atribuição Composta
Este é mais um novo recurso do SQL 2008 que permite juntar um operador aritmético ( + – / * ) com o operador de atribuição (=).
Exemplo:
declare @Total Int set @Total = 5 set @Total *= 2
Observação: Operadores aritméticos também são chamados de bitwise.
Este é um recurso que já existe em diversas linguagens de programação, tais como C# e Java, as vantagens em utiliza-lo são:
- Reduz o tempo de processamento de determinadas chamadas
- Deixa o código mais legível
- Economiza a codificação
Abaixo uma tabela com os operadores de atribuição composta com a forma convencional equivalente:
|
Operador |
Operação |
Atribuição composta |
Forma convencional equivalente |
|
+= |
Adição |
set @total += 1 |
set @total = @total + 1 |
|
-= |
Subtração |
set @total -= 1 |
set @total = @total – 1 |
|
*= |
Multiplicação |
set @total *= 1 |
set @total = @total * 1 |
|
/= |
Divisão |
set @total /= 1 |
set @total = @total / 1 |
|
^= |
XOR bit a bit |
set @total ^= 1 |
set @total = @total ^ 1 |
|
&= |
AND bit a bit |
set @total &= 1 |
set @total = @total & 1 |
|
|= |
OR bit a bit |
set @total |= 1 |
set @total = @total | 1 |
Importante: Só é possível realizar apenas uma atribuição composta a uma mesma variável na mesma linha, o exemplo abaixo não é possível:
set @total += @total -= 2
Porém, é possível realizar várias atribuições a uma mesma variável utilizando a instrução select, conforme o exemplo abaixo:
SELECT @Total = @Total +1, @Total += 2
Observação: Neste caso, a atribuição ocorre da esquerda para a direita.
Novidades SQL Server 2008 – Insert com múltiplos valores
Uma grande novidade incorporada na versão do SQL Server 2008 é a possibilidade de realizar um insert com múltiplos valores.
Imagine que você precise criar uma massa de dados para realizar testes por exemplo, que seja necessário incluir uma lista de nomes em uma tabela.
Até a versão do SQL Server 2005 você precisava criar uma instrução INSERT para cada registro a ser adicionado na tabela, conforme exemplo abaixo:
INSERT INTO tb_Clientes (codigo, nome, sobrenome) VALUES (1,'Joaquim','da Silva') INSERT INTO tb_Clientes (codigo, nome, sobrenome) VALUES (2,'Maria','Aparecida') INSERT INTO tb_Clientes (codigo, nome, sobrenome) VALUES (3,'João','Bezerra') INSERT INTO tb_Clientes (codigo, nome, sobrenome) VALUES (4,'Gomes','da Costa')
Outra opção seria utilizar o INSERT com o SELECT e UNION ALL:
INSERT INTO tb_Clientes (codigo, nome, sobrenome) SELECT 1,'Joaquim','da Silva' UNION ALL SELECT 2,'Maria','Aparecida' UNION ALL SELECT 3,'João','Bezerra' UNION ALL SELECT 4,'Gomes','da Costa'
Agora, com este novo recurso trazido pelo SQL Server 2008, é possível realizar um INSERT com múltiplos valores, a situação acima pode ser escrita da seguinte forma:
INSERT INTO tb_Clientes (codigo, nome, sobrenome) VALUES (1,'Joaquim','da Silva' ), (2,'Maria','Aparecida'), (3,'João','Bezerra'), (4,'Gomes','da Costa')
Melhorou, não!?!?
Novidades SQL Server 2008 – Inicialização de variáveis locais
Uma das novidades no SQL Server 2008 é a declaração e inicialização de variáveis locais.
Até a versão SQL Server 2005, para declarar e inicializar uma variável local eram necessárias duas linhas de código, conforme o exemplo abaixo:
declare @volume int set @volume = 453
Agora, na versão 2008 é possível declarar e inicializar uma variável local em uma única linha, veja o exemplo abaixo:
declare @volume int = 453
Se tentarmos fazer o mesmo na versão 2005, por exemplo, teremos a seguinte mensagem de erro:
Msg 139, Level 15, State 1, Line 0
Cannot assign a default value to a local variable.
Podemos utilizar este novo recurso da linguagem T-SQL, que trará produtividade e tornará o código mais limpo, para declaração de múltiplas variáveis:
declare @volume int = 453, @setor int = 96, @opcao char(1) = 'T'
Esta é uma dentre várias outras novidades do SQL Server 2008.