5

我们将所有数据库对象作为可重新运行的脚本(视图、函数、触发器和存储过程等...)签入源代码控制

在部署时,我们需要确保所有脚本都是可重新运行和可重复的,以便将存储过程创建/更新到最新版本。

以以下方式创建脚本是否有任何缺点。

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.

所以好处对我来说是显而易见的,我只是想知道这样做有什么缺点......除了编写稍微冗长的脚本的轻微开销之外。

4

1 回答 1

2

这里是 10 年的 SQL Server 开发人员/架构师,除了创建执行此操作的脚本的(相对轻微的)前期成本之外,我想不出任何缺点。

如果您担心在过程更改时不会重新编译在创建时编译为微不足道的计划,您可以为每个计划添加对 SP_RECOMPILE 的显式调用,但我从来没有遇到过 SQL Server 的这个问题(我有它与 DB2),所以我认为这是过度谨慎。

这是一个有趣且我认为有用的方法。

于 2012-12-20T12:57:19.903 回答