Este artigo faz um bom ponto sobre a perda de permissões ao soltar um objeto no SQL Server.
Então, aqui está a abordagem que retém permissões:
IF OBJECT_ID('spCallSomething') IS NULL
EXEC('CREATE PROCEDURE spCallSomething AS SET NOCOUNT ON;')
GO
ALTER PROCEDURE spCallSomething ...
--instead of DROP/CREATE
Também funciona para funções, basta substituir
PROCEDURE
com FUNCTION
no código acima. Outra razão para considerar fazê-lo desta forma é a tolerância ao fracasso. Suponha que seu DROP seja bem-sucedido, mas seu CREATE falhe - você termina com um banco de dados quebrado. Usando a abordagem ALTER, você acabará com uma versão mais antiga do objeto.