我对数据库项目不够熟悉,无法回答是否可以进行 DROP 和 CREATE。但是,总的来说,我发现 CREATE 和 ALTER 比 DROP 和 CREATE 更好。
通过 CREATE 和 ALTER 我的意思是:
IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'MyProc'
AND ROUTINE_TYPE = 'PROCEDURE')
BEGIN;
-- CREATE PROC has to be the first statement in a batch so
-- cannot appear within a conditional block. To get around
-- this, make the statement a string and use sp_ExecuteSql.
DECLARE @DummyCreateText NVARCHAR(100);
SET @DummyCreateText = 'CREATE PROC dbo.MyProc AS SELECT 0;';
EXEC sp_ExecuteSql @DummyCreateText;
END;
GO
ALTER PROCEDURE dbo.MyProc
AS
SELECT yadda...
CREATE 和 ALTER 优于 DROP 和 CREATE 的优点是存储过程只创建一次。一旦创建,它就永远不会被删除,因此权限不会被删除并且不会被重新创建。
在完美的世界中,存储过程的权限将通过数据库角色应用,因此在删除并重新创建存储过程后重新应用它们很容易。然而,实际上,我经常发现几年后其他应用程序可能会开始使用相同的存储过程,或者出于某种原因,好心的 DBA 可能会申请新的权限。所以我发现 DROP 和 CREATE 往往会导致应用程序在几年后崩溃(当它是你一无所知的其他人的应用程序时,情况总是更糟)。CREATE 和 ALTER 避免了这些问题。
顺便说一句,虚拟创建语句 "CREATE PROC dbo.MyProc AS SELECT 0" 可用于任何存储过程。如果真正的存储过程将有参数或返回一个包含多个列的记录集,这些列都可以在 ALTER PROC 语句中指定。CREATE PROC 语句只需要创建最简单的存储过程。(当然,CREATE PROC 语句中存储过程的名称需要更改以匹配您的存储过程的名称)