我们有数据库部署过程适用于生产数据库。如果存储过程/视图/函数与当前部署不一致,则此过程将更改它们的定义。问题是即使它们没有改变,部署过程也会运行ALTER步骤以确保它们是最新的。由于我们已经获得了OLTP环境,因此在部署期间我们会阻塞存储过程/函数。
如果定义发生了变化,我想要实现的只是改变SP / view / function。
我们已经考虑过做HashValue对象定义的比较(不适用于大型定义),修改日期比较系统表中的对象,SSDT,Redgate SQL比较/源代码控制。
是否有任何其他方法可用于在部署期间比较定义,并且只有在更改后才应用alter脚本。
提前感谢您的投入。
答案 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