SQL Server e SQL Azure – Licenciamento + Billing
Então pessoal, como estão?
Sei que estou postando fortemente sobre Business Intelligence, mas hoje gostaria de iniciar algo diferente.
Se eu fosse elencar as dúvidas que recebo mais frequentemente dos clientes e parceiros, com certeza seria licenciamento em primeiro lugar.
A plataforma de dados da Microsoft é o SQL Server e o seu braço na nuvem é o SQL Azure. Por isso vou dividir esse conjunto de posts da seguinte forma (vou adicionar os links a esse post conforme os posts seguintes saírem), mas não necessariamente nesta mesma ordem.
-
SQL Server, Analysis Services, Integration Services, preciso de uma licença para cada um?
-
SQL Server com Cluster, Mirror e Log Shipping, o que preciso licenciar?
-
SQL Server virtualizado e ambientes híbridos: Virtualizado + não-virtualizado.
-
SQL Azure – Espaço, transferência? Como funciona e quanto custa?
A ideia dos posts é não é entrar na precificação (com excessão do SQL Azure), pois há várias modalidades contratuais e esses aspectos de contratos e programas de relacionamento com a Microsoft eu não irei abordar.
Gostaria de um feedback de vocês que leem o blog (nos comentários) sobre esta sequência de posts. Isso é muito importante! Aceito sugestões!!
Abraços,
Thiago Zavaschi
Repostagem – Utilizando Campos Identity no SQL Server
Olá a todos!
Primeiramente gostaria de dizer que este é um post para o nível iniciante, e serve como base para aquelas perguntas “como é que eu fazia aquilo mesmo?”. É baseado em um mini artigo que escrevi, e este post também já publiquei no DevBR.
Em muitas ocasiões nos deparamos com situações em que precisamos trabalhar em alguma coluna que seja identity. Este mini-artigo descreve alguns comandos úteis na manipulação destas colunas.
Criando uma tabela com campo identity: Devemos criar com o parâmetro identity, e configurar o primeiro valor, e o valor de incremento, respectivamente (IDENTITY (<inicio>,<incremento>)). Conforme no exemplo a seguir:
CREATE TABLE Tabela ( Id INT IDENTITY (1,1) PRIMARY KEY, Valor VARCHAR(50) )
Reiniciando o valor do campo identity: Algumas vezes precisamos alterar o valor do identity (para reiniciar a contagem, por exemplo). Há o comando truncate que além de limpar a tabela (entre outras coisas), também zera o valor do identity. No entanto, se o nosso objetivo é apenas trocar o valor do identity, o truncate não é uma saída interessante. Para manipular o identity podemos fazer como descrito a seguir:
Vamos imaginar que queremos que o próximo registro a ser inserido na tabela Tabela queremos que sua chave primária Id, se inicie em 1.
Para resolver esse problema, podemos usar a seguinte instrução:
DBCC CHECKIDENT (Tabela, reseed, 0)
O último parâmetro se torna o valor atual do identity. Ao inserir o próximo registro, o mesmo virá com o seu Id com o valor identity somado de 1 (caso seja um identity de incremento 1), o valor do identity da tabela vai para 1, e assim por diante.
Recuperar o último valor inserido de um campo identity: Para recuperar o último valor de identity inserido (ex: inserir algo em uma tabela, e cadastrar um novo registro com o id do registro recém inserido), podemos utilizar:
@@IDENTITY, que retorna o valor do identity do último registro inserido na tabela, ou;
SCOPE_IDENTITY(), que retorna o último valor mas dentro do escopo em que a query foi executada.
Não recomendo a utilização de @@IDENTITY, pois isso pode acarretar problemas de consistência em cenários onde existe um alto grau de inserção/manipulação dos dados no banco (ou mais especificamente, na tabela em questão).
Um exemplo simples de uso pode ser:
DECLARE @techId INT INSERT INTO Tabela (Valor) VALUES (‘Testando Identity’) SELECT @techId = SCOPE_IDENTITY()
---
Um complemento em relação ao post original:
”Zavaschi, e se eu quiser inserir um registro em uma tabela, mas somente nessa inserção quero especificar o valor do campo identity. É possível?”
É sim, basta fazer da seguinte forma:
SET IDENTITY_INSERT Tabela ON INSERT INTO Tabela (Id, Valor) VALUES (123, ‘Informação’) SET IDENTITY_INSERT Tabela OFF
Simples, mas temos que lembrar que precisamos explicitar os campos, ainda que estejamos fazendo uma inserção em todas as colunas.
É isso, espero que tenham gostado!
Abraços!
Thiago Zavaschi
Repostagem – Como Proteger as Minhas Stored Procedures ?
Como proteger as minhas stored procedures?
Bom pessoal, o assunto do post de hoje não é uma novidade, mas hoje a tarde estava conversando com um amigo (Eduardo Ordine) e chegamos ao assunto de proteção às stored procedures no banco de dados SQL Server, vamos lá!
“Thiago, estou colocando minhas stored procedures em um banco de dados compartilhado, ou que a administração não cabe a mim, e nas mesmas eu tenho regra de negócio importante e confidencial da minha empresa, tem como protegê-las?”
A resposta é: Sim!
As aplicações costumam ser divididas em camadas para agilizar seu entendimento e, principalmente, facilitar as manutenções. Acontece que eu, como consultor/estudante/desenvolvedor, já MUITAS empresas que colocam a regra de negócio em stored procedures do banco de dados, utilizando as linguagens de programação (.NET (C# e VB.NET), Delphi, VB, etc.) apenas como casca gráfica. Méritos e desvantagens à parte, temos o que: a necessidade de proteger estas procedures no banco de dados. Entendemos que “proteger” é igual a evitar que descubram o conteúdo das procedures.
Proteger 100% e garantir que NUNCA NINGUÉM conseguirá ver o conteúdo da procedure é utopia, mas podemos dificultar BASTANTE o acesso à mesma através da encriptação da procedure.
A stored procedure continua podendo ser executada normalmente (segundo as permições dos usuários da base de dados), mas ninguém ve o seu conteudo.
Como fazer?
Se a sua procedure ia ser criada com um comando similar a este:
CREATE PROCEDURE dbo.spImportante BEGIN SELECT 'Thiago Zavaschi' END
Então utilize da seguinte forma:
CREATE PROCEDURE dbo.spImportante WITH ENCRYPTION AS BEGIN SELECT 'Thiago Zavaschi' END
“Pronto Thiago, encriptei a minha procedure, estou seguro e não preciso me preocupar com mais nada, certo?”
Errado! E vejamos o porquê.
Vou criar aqui a procedure do exemplo acima e tentarei fazer alguns testes.
Primeiro farei um exec.
---------------
Thiago Zavaschi
(1 row(s) affected)
Beleza, executado com sucesso! Agora vou executar a sp_helptext:
The text for object 'spImportante' is encrypted.
Não consigo ver, até mesmo o “Modify” do Management Studio fica desabilitado, impedindo a geração do script (e o mesmo vale para todas as formas de geração de scripts do SSMS).
“Bom Thiago, para mim parece bem seguro.”
Será mesmo?
Vamos fazer mais um teste: Vou ligar o SQL Server Profiler monitorando o banco e vou executar novamente a procedure (vimos que a execução é permitida sem problemas), e temos:

Ok, texto encriptado, mas e se rodarmos o profiler DURANTE a criação da procedure:

Opa, opa, opa, temos a visualização da procedure. Tem como proteger-se disso? Tem sim, basta adicionar um comentário (-- comment: sp_password) ao seu script.
Infelizmente há como burlar essa segurança (não vou mostrar como se faz, pois não acho ético), eu fiz aqui alguns métodos mas não consegui para algumas procedures, pois eram SPs CLR.
Consegui abrir essas stored procedures por outros métodos (que também não vou comentar quais), mas fiz isso só para mostrar que com segurança não devemos brincar!
Então fica aí a dica!
E não se esqueçam de manter o código original da stored prcedure em um lugar a salvo (de preferência sob o controle de um controlador de código como o TFS, etc.).
Grande abraço e até a próxima!
Thiago Zavaschi
Repostagem – Tutorial: Configurando o Database Mail
Então pessoal, sei que prometi o artigo de PowerPivot, mas estou finalizando-o ainda. Enquanto isso farei a repostagem de alguns posts do antigo blog que não vieram no processo de importação (não serão muitos).
Tutorial: Configurando o DatabaseMail
O Database Mail é a evolução do SQL Mail (método marcado como obsoleto e fadado a ser removido do SQL Server em uma próxima versão) com melhorias. Se você por alguma razão utiliza o SQLMail com o SQL Server 2005 ou 2008, considere a mudança imediata.
O objetivo deste artigo é mostrar o wizard de configuração do DatabaseMail e demonstrar como enviar emails através do T-SQL, além de como verificar o status dos emails enviados.
A base deste tutorial é o novo SQL Server 2008, porém os passos são muito similares no SQL Server 2005.
Configurando o Database Mail
Abra a instância desejada, abra a janela Object Explorer, abra a pasta Management e clique duas vezes no “Database Mail” para abrir a seguinte janela:

Iniciaomente somos deparados com a tela de boas vindas do wizard de configuração. Não há muito oq ue fazer aqui, podemos marcar para não ser exibida novamente e clicar em Next para prosseguir.

Marque a opção “Set up Database Mail by performing the following tasks:” e clique em next.

Caso o Database Mail não esteja habilitado você será indagado a habilitá-lo. Clique em Yes para ativar.

Dê um nome e uma descrição a conta. Após isto clique em “Add”.

Configure os dados pedidos: Nome, descrição, endereço de email, servidor smtp, e assim por diante. Clique em Ok quando terminar.

Clique em next para prosseguir.

Aqui estou tornando essa configuração pública (marcando a checkbox “public”) e tornando o perfil padrão.

Agora é a hora de configurar alguns parâmetros de sistema, como por exemplo, a extensão de arquivos que não podem ser enviados ao utilizar o database mail.
Após configurar como desejar, clique em next.

Clique em finish para encerrar o wizard e terminar de configurar a sua conta.

Esta tela mostra o progresso da configuração. Repare na coluna status, pois ela fornece a informação de se a tarefa foi bem sucedida ou não. Clique em close para encerrar.
Enviando emails
Para enviar emails através do DatabaseMail é bastante simples.
É necessário primeiramente executar a seguinte configuração para garantir que não haverá problemas:
sp_configure 'show advanced', 1
GO
RECONFIGURE
GO
sp_configure 'Database Mail XPs', 1
GO
RECONFIGURE
GO
Na sequência podemos utilizar a stored procedure de sistema denominada: sp_send_dbmail, cuja sintaxe é mostrada a seguir (para mais detalhes consulte o books online):
sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]
[ , [ @recipients = ] 'recipients [ ; ...n ]' ]
[ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ]
[ , [ @blind_copy_recipients = ] 'blind_copy_recipient [ ; ...n ]' ]
[ , [ @subject = ] 'subject' ]
[ , [ @body = ] 'body' ]
[ , [ @body_format = ] 'body_format' ]
[ , [ @importance = ] 'importance' ]
[ , [ @sensitivity = ] 'sensitivity' ]
[ , [ @file_attachments = ] 'attachment [ ; ...n ]' ]
[ , [ @query = ] 'query' ]
[ , [ @execute_query_database = ] 'execute_query_database' ]
[ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]
[ , [ @query_attachment_filename = ] query_attachment_filename ]
[ , [ @query_result_header = ] query_result_header ]
[ , [ @query_result_width = ] query_result_width ]
[ , [ @query_result_separator = ] 'query_result_separator' ]
[ , [ @exclude_query_output = ] exclude_query_output ]
[ , [ @append_query_error = ] append_query_error ]
[ , [ @query_no_truncate = ] query_no_truncate ]
[ , [ @mailitem_id = ] mailitem_id ] [ OUTPUT ]
Segue um exemplo prático de envio de email:
USE msdb
GO
EXEC sp_send_dbmail @profile_name='Zavaschi', -– Coloque o profile desejado.
@recipients='thiagoh@techresult.com.br', – Coloque os receptores da mensagem.@subject='Título da Mensagem',
@body='Corpo da mensagem.
E-mail recebido através do database mail do SQL Server!!!!'
Note que o envio não é disparado necessariamente na hora, ele é posto numa fila e o envio dependerá das condições da rede e de conectividade.
Podemos analisar as mensagens e o status do envio das mesmas, através dos seguintes comandos de seleção:
SELECT * FROM sysmail_mailitems
GO
SELECT * FROM sysmail_log
GO
É isso, abraços pessoal!
Thiago Zavaschi