我们将所有数据库对象作为可重新运行的脚本(视图、函数、触发器和存储过程等...)签入源代码控制
在部署时,我们需要确保所有脚本都是可重新运行和可重复的,以便将存储过程创建/更新到最新版本。
以以下方式创建脚本是否有任何缺点。
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'dbo'
AND ROUTINE_NAME = 'MyStoredProcedure'
)
BEGIN
EXEC ('CREATE PROCEDURE [dbo].[MyStoredProcedure] AS SELECT 1')
-- ALSO DO ANY INITIAL GRANT PRIVILEGE SCRIPTING HERE
END
GO
ALTER PROCEDURE [dbo].[MyStoredProcedure] (
@param1 INT,
@param2 NVARCHAR(50) = 'Default String'
)
AS
BEGIN
-- DO SOMETHING WITH @param1 AND @param2
SELECT 1;
END
GO
本质上,脚本会检查对象是否存在于相关系统视图中,如果不存在,则某些动态 sql 会将其创建为存根,以解决CREATE PROCEDURE/GO
条件块中不允许出现的语句问题。然后它通过ALTER
.
所以好处对我来说是显而易见的,我只是想知道这样做有什么缺点......除了编写稍微冗长的脚本的轻微开销之外。