Questo articolo illustra bene la perdita delle autorizzazioni quando si rilascia un oggetto in SQL Server.
Quindi ecco l'approccio che mantiene le autorizzazioni:
IF OBJECT_ID('spCallSomething') IS NULL
EXEC('CREATE PROCEDURE spCallSomething AS SET NOCOUNT ON;')
GO
ALTER PROCEDURE spCallSomething ...
--instead of DROP/CREATE
Funziona anche per le funzioni, basta sostituire PROCEDURE
con FUNCTION
nel codice sopra.
Un altro motivo per considerare di farlo in questo modo è la tolleranza al fallimento. Supponiamo che il tuo DROP abbia successo, ma il tuo CREATE fallisca:finisci con un DB rotto. Utilizzando l'approccio ALTER, ti ritroverai con una versione precedente dell'oggetto.