Тази статия прави добра гледна точка относно загубата на разрешения при изпускане на обект в SQL сървър.
И така, ето подходът, който запазва разрешенията:
IF OBJECT_ID('spCallSomething') IS NULL
EXEC('CREATE PROCEDURE spCallSomething AS SET NOCOUNT ON;')
GO
ALTER PROCEDURE spCallSomething ...
--instead of DROP/CREATE
Работи и за функции, просто заменете PROCEDURE
с FUNCTION
в горния код.
Друга причина да обмислите да го направите по този начин е толерантността към провала. Да предположим, че вашият DROP успее, но вашият CREATE се провали - завършвате с повредена DB. Използвайки подхода ALTER, ще получите по-стара версия на обекта.