我们将所有数据库对象检入源控件作为可重新运行的脚本(视图,函数,触发器和存储过程等...)
在部署时,我们需要确保所有脚本都可以重新运行。可重复,以便创建/更新存储过程到最新版本。
以下列方式创建脚本是否有任何缺点。
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
。
所以这些好处对我来说是显而易见的,我只是想知道这样做是否有任何缺点......除了编写稍微冗长的脚本的轻微开销。
答案 0 :(得分:2)
这里有10年的SQL Server开发人员/架构师,除了创建执行此操作的脚本的(相对较小的)前期成本之外,我无法想到任何缺点。
如果您担心在更改过程时不会重新编译在创建时编译为平凡的计划,则可以为每个程序添加对SP_RECOMPILE的显式调用,但我从未遇到过SQL Server的这个问题(我已经使用了DB2),因此我认为这是过分谨慎。
这是一个有趣且我认为有用的方法。