SQL GO!!!

select 'Blog focado em SQL Server' from blog where nome ='SQLGO.wordpress.com'

Nomenclatura de stored procedure

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.

2 Respostas para “Nomenclatura de stored procedure

  1. Emerson março 29, 2011 às 1:00 pm

    Senhores, bom dia.
    Realmente é uma falha de segurança, porém utilizando as políticas de acesso correto, isso não ocorrerá.

    Complementado, quando criamos uma procedure iniciado com “sp_”, o SGBD vai buscar esta sp inicialmente na base apotada pelo acesso, ou seja, ao executar a sp na base X, o SGBD vai buscar PRIMEIRAMENTE nesta base na tabela sys.sysobjects, caso não encontre, o SGBD vai buscar na master, isso se o usuário tiver acesso a master.
    Portanto, caso há a necessidade da criação de procedure começando com “sp_”, tire o “_”, assim, o sistema não irá buscar na master, exemplo “spTESTE”.
    Outra coisa, nunca criamos usuário para as aplicações com acesso a base master, somente com acesso as bases necessárias…

    Segue rotina exemplo que comprova este comentário:

    Primeiramente crie uma tabela de teste conforme exemplo, na master e na base de teste:

    CREATE TABLE [dbo].[tblTeste](
    [Nome] [varchar](50)
    ) ON [PRIMARY]

    Em seguida crie uma procedure de teste na master conforme exemplo:

    CREATE PROCEDURE [dbo].[sp_TesteMaster]
    AS
    BEGIN
    Insert into tblTeste values(‘Banco master’)
    END

    Agora crie a mesma procedure na base de teste conforme exemplo:

    CREATE PROCEDURE [dbo].[sp_TesteMaster]
    AS
    BEGIN
    Insert into tblTeste values(‘Banco DBTeste’)
    END

    ok, agora, execute a sp_TesteMaster na base de teste, voce verá que há a inclusão somente do registro na tblTeste da base DBTeste e não há registro na tabela criado na master, pois o SGBD achou a sp primeiramente na base de teste e a executou.
    Agora, renomeie a sp da base de teste para sp_TesteMasterXXX, e execute novamente a sp sp_TesteMaster na base de teste, você verá que há um registro incluído na tabela criado na master.

    Agora se você renomear as sps para spTesteMaster, ou seja, tirando o “_”, este processo é anulado, pois o SGBD não entende mais que é uma sp de sistema.
    Tente fazer o mesmo processo sem o “_”

    Abraços

    • socorrovieira agosto 6, 2011 às 7:40 pm

      Sim, sim, concordo com você. Se o usuário tiver o acesso correto, esse problema não ocorrerá. Entretanto, pode acontecer de alguém deixar a master como banco default e dar permissões necessárias nos bancos de usuário. A falta do acesso correto, pode gerar o que eu citei no post.
      Mas caso o acesso seja o correto, a procedure executará corretamente no banco do usuário, como voce explicou.

      []s

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: