SQL Server对象版本控制

时间:2014-05-14 05:43:44

标签: sql sql-server

我们有数据库部署过程适用于生产数据库。如果存储过程/视图/函数与当前部署不一致,则此过程将更改它们的定义。问题是即使它们没有改变,部署过程也会运行ALTER步骤以确保它们是最新的。由于我们已经获得了OLTP环境,因此在部署期间我们会阻塞存储过程/函数。

如果定义发生了变化,我想要实现的只是改变SP / view / function。

我们已经考虑过做HashValue对象定义的比较(不适用于大型定义),修改日期比较系统表中的对象,SSDT,Redgate SQL比较/源代码控制。

是否有任何其他方法可用于在部署期间比较定义,并且只有在更改后才应用alter脚本。

提前感谢您的投入。

2 个答案:

答案 0 :(得分:1)

您可以利用SSDT的架构比较功能。此外,当您在SSDT中发布数据库项目时,它将生成仅包含差异的脚本。

请在http://channel9.msdn.com/Events/Visual-Studio/Launch-2013/VS108

查看介绍视频

答案 1 :(得分:0)

您可以尝试使用以下脚本 基本上它创建了一个Stored Procedure,它将一个对象名称(SP /视图/函数)和一个alter命令作为参数。存储过程检查是否“更改”。参数将改变现有对象,并且只有它将运行它。

/****** Object:  StoredProcedure [dbo].[AlterDbObjectIfNecessary]    Script Date: 05/14/2014 09:28:30 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[AlterDbObjectIfNecessary]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[AlterDbObjectIfNecessary]
GO



/****** Object:  StoredProcedure [dbo].[AlterDbObjectIfNecessary]    Script Date: 05/14/2014 09:28:30 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- create new user-toolset relation/ toolset User
CREATE PROCEDURE [dbo].[AlterDbObjectIfNecessary]
    @alterCommand NVARCHAR(MAX) ,
    @AlteredObjectname NVARCHAR(MAX)
AS
BEGIN


    DECLARE @objId INT
    DECLARE @objName NVARCHAR(max)
    DECLARE @Def nvarchar(max)

    --Getting the ID of the object you want to alter
    SELECT
        @objId = id, @objName = o.name
    FROM sysobjects o 
    WHERE   o.type IN ('P', 'TR', 'V', 'TF', 'FN', 'IF')
            AND o.name = @AlteredObjectname


    --Getting the later definittion
    SELECT @Def = [definition]
    FROM sys.sql_modules 
    WHERE object_id = @objId


       --print @objName
       --print @def
       SET @def = REPLACE(@def, 'create PROC','alter PROC')
       SET @def = REPLACE(@def, 'create procedure','alter procedure')
       SET @def = REPLACE(@def, 'create function','alter function')
       SET @def = REPLACE(@def, 'create view','alter view')


    IF UPPER (@def) <> UPPER (@alterCommand)
    BEGIN
        BEGIN TRY   
            --PRINT @alterCommand       
            --Alter the object to new definition
            EXEC sp_executesql @alterCommand
            PRINT @objName + ' Was Modified'
        END TRY
        BEGIN CATCH     
                PRINT 'Error. Failed to modify ' + @objName + ' : ' + CONVERT(nvarchar(10), ERROR_NUMBER()) + ' ' + ERROR_MESSAGE()
        END CATCH
    END
    ELSE
    BEGIN 
        PRINT 'Modification was not required for ' +@objName
    END


END
GO

您可以通过以下方式使用它:

DECLARE @alterCommand NVARCHAR(MAX)
DECLARE @AlteredObjectname NVARCHAR(MAX)

SET @AlteredObjectname = 'MyObjectName' -- <Insert here the name of object you want to alter
SET @alterCommand = 'ALTER PROCEDURE [dbo].[MyObjectName]
-- The rest of the alter stattement    
 '
EXEC AlterDbObjectIfNecessary @AlteredObjectname, @alterCommand