Como anunciamos por aqui, eu e Andressa realizamos um webcast no fim de fevereiro. No fim, tivemos tempo para responder algumas perguntas ao vivo. E uma delas foi se há perda de performance no uso da nomenclatura SP no início da stored procedure. Eu respondi a pergunta, porém, algumas pessoas nos procuraram para dizer que desconheciam esta recomendação. E isso é uma verdade, pois vejo muitas empresas utilizando essa nomenclatura em seus bancos de dados. Portanto, eu resolvi escrever mais sobre assunto.
Como eu respondi no webcast, a perda de performance pode ser irrisória, dependendo da aplicação. Entretanto temos outro problema a ser observado, a segurança. Pois ao executar uma stored procedure iniciada por SP, o SQL Server busca no banco master, o que pode deixar brechas para atos maliciosos.
E o que seria um ato malicioso? Imaginem uma instituição bancária, onde existe uma stored procedure chamada ‘SP_TransferenciaContaCorrente’ no banco de dados MovimentacaoBancaria, que é executada quando há a transferência entre contas correntes. Até aqui nenhum problema, não é? Agora imaginem a mesma procedure sendo criada no banco master, entretanto transferindo um centavo para conta de algum espertinho ao executar cada transferência. O que vai acontecer aqui? Quem vai ser executada primeira? Como eu disse no nosso webcast, ao criarmos uma stored procedure iniciando com SP, o SQL Server entende que é uma procedure de sistema e procura primeiro no banco master. Ao encontrá-la, ele executará e obviamente não passará pelo banco MovimentacaoBancaria. Então o espertinho receberá um centavo a cada transferência efetuada.
Portanto, baseado na explicação acima, a melhor prática não recomenda o uso da nomenclatura ‘SP’ no ínicio da stored procedure por deixar furos de segurança na sua instância do SQL Server e de desempenho dependendo da aplicação. Recomenda-se utilizar proc_nomedaprocedure, USP_nomedaprocedure ou qualquer nome desejado. Além disso, a partir do SQL Server 2008, é possível utilizar a ferramenta Policy Management para definir padrões de nomenclatura (assunto para outro post!), evitando nomes indesejados como o explicado nesse post.