Um stored procedure (procedimento armazenado) é um conjunto de instruções em linguagem Transact-SQL, guardadas no servidor de forma pré-compilada. A execução pode ser feita dentro do próprio SQL ou através de uma aplicação externa, como é p caso do Visual Studio.
Os stored procedures têm algumas vantagens em relação aos comandos directos ao servidor, como é o caso de modularidade (simples de modificar sem alterar o código da aplicação), rapidez (ficam pré-compilados e ficarem em cache), entre outras, mas gostava de destacar a segurança e na protecção a ataques denominados SQL Injection.
Os SQL injection são instruções que manipulam a query, alterando a entrada de dados no servidor, através de uma aplicação externa. São uma das maiores causas de falhas de segurança das aplicações e podem destruir toda a estrutura de dados.
Para uma melhor percepção da importância dos stored procedures e da protecção aos SQL Injection, recomendo a visualização de um webcast gratuito, disponível na MSDN Brasil de Luciano Moreira: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&EventID=1032383827&CountryCode=BR
A utilização de stored procedures em Visual Basic.Net é bastante simples. Cria-se a tabela, depois um novo stored procedure e para finalmente o código.
O seguinte exemplo mostra como criar um stored procedure e como é simples, através do código, mostrar, inserir, modificar ou apagar dados. Não serão mostrados todos os exemplos, uma vez que as principais diferenças estão nos comandos T-SQL e não propriamente no código.
Para o seguinte exemplo foi criada uma tabela simples, com o nome produtos, com três campos apenas:
ID INT (primary key)
codigo INT
produto VARCHAR(50)
Um exemplo simples de um stored procedure para listar todos os dados da tabela produtos seria:
CREATE PROCEDURE dbo.sp_produtos
AS
BEGIN
SELECT * FROM produtos;
END
Após a gravação do stored procedure a instrução CREATE passa a ALTER, porque o que será feito posteriormente é uma alteração ao procedimento e não uma criação. Para o exemplo será feito um stored procedure um pouco mais complexo, que permita a pesquisa por código ou por produto (ou parte do nome).
/*
Stored Procedure que permite a pesquisa por
código ou nome (ou parte do nome) do produto
*/CREATE PROCEDURE dbo.sp_produtos
/** Indicação dos parâmetros de entrada com um valor por defeito
o que permite que não sejam indicados através do código */
@codigo INT = NULL,
@produto VARCHAR(50) = NULLAS
BEGINSELECT *
FROM produtos
-- Definição do filto da pesquisa
WHERE (@codigo IS NULL OR codigo = @codigo)
AND (@produto IS NULL OR produto LIKE '%'+ @produto + '%');END
Depois no código de Visual Basic.Net:
' Informação da Connection String
Dim myConnectionString As String = _
"Data Source=.\SQLEXPRESS;AttachDbFilename='c:\myDatabase.mdf';Integrated Security=True;User Instance=True"' Ligação à base de dados
Using connection As New SqlConnection(myConnectionString)
connection.Open()
' Indica o nome do Stored Procedure e que o tipo do comando
Dim command As New SqlCommand("sp_produtos", connection)
command.CommandType = CommandType.StoredProcedure' Caso o código tenha sido indicado
If txtCodigo.Text <> String.Empty Then
command.Parameters.Add("@codigo", SqlDbType.Int).Value = txtCodigo.Text
End If' Caso o produto tenha sido indicado
If txtProduto.Text <> String.Empty Then
command.Parameters.Add("@produto", SqlDbType.VarChar).Value = txtProduto.Text
End If' Executa o comando e guarda o resultado no SqlDataReader
Dim reader As SqlDataReader = command.ExecuteReader()' Caso tenha resultados
If reader.HasRows Then' Ciclo que irá mostrar os produtos encontrados
While reader.Read
Dim result As String = _
String.Format("{0}-{1}-{2}", reader.Item(0), reader.Item(1), reader.Item(2))
Debug.WriteLine(result)
End While
Debug.WriteLine("Fim da pesquisa!") ' Informação no fim da pesquisaElse
' Caso não tenham sido encontrados produtos ...
Debug.WriteLine("Não foram encontrados produtos!")End If
reader.Close()
reader = NothingEnd Using 'connection
Este exemplo mostra como listar (na Immediate Window) os produtos de uma tabela, permitindo ou não, indicar dados de modo a estabelecer um filtro de pesquisa. Para inserir dados, modificar ou mesmo apagar é necessário adequar o stored procedure e o código é bastante semelhante, como já mostrado em artigos anteriores.
Este artigo pretende apenas mostrar, de uma forma geral, alguns dos benefícios dos stored procedures e a sua importância na melhoria de performance e segurança dos dados.
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
1 comentários:
Boa Tarde
Como eu faria com o codigo explicado acima, imprimir pelo crystal reports ?
Enviar um comentário