彩票走势图

SQL Compare使用教程:数据库开发阶段(二)

翻译|使用教程|编辑:杨鹏连|2020-07-10 09:22:45.590|阅读 314 次

概述:本文介绍了所有这些任务,并演示了使用SQL Compare可以实现的功能。在随后的文章中,我将显示任务槽到自动SQL Change Automation过程中。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

SQL Compare是一款比较和同步SQL Server数据库结构的工具。现有超过150,000的数据库管理员、开发人员和测试人员在使用它。当测试本地数据库,暂存或激活远程服务器的数据库时,SQL Compare将分配数据库的过程自动化。

点击下载SQL Compare试用版

将数据库置于源代码管理中

我们要做的下一件事是将当前版本的Pubs放入源代码管理(GitHub)中。我只是使用SQL Compare来做到这一点(请参阅使用SQL Compare的追溯数据库源控件),但是您可能更喜欢使用SQL Source Control。

将当前版本的Pubs数据库设置为源,将新创建的GitHub目录的Build子目录设置为目标。

然后,我在version.json文件中添加相同的起始版本号“ 2.1.5” 。这是Pubs项目的整体版本(与数据库构建版本相同),因此我们将文件放置在GitHub项目的基本文件夹中(使用自述文件)。

{
"$schema": "//raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", "version": "2.1.5"
}
最后,在我们的开发服务器上建立一个开发数据库。它从与当前版本相同开始。在开发过程中,您可以随意随意销毁和重建该副本。您可以通过从源代码构建新版本,然后填充当前版本的测试数据来创建此副本,或者如果它位于同一服务器上,则可以使用“杀死并填充”方法重复填充数据以进行测试。如果您经常执行此任务,则需要看一下  SQL Clone,  因为它使一切变得非常容易。



第一个版本


我们决定对我们的开发数据库进行一些紧急更新。我们将只更新pub_info具有一些过时数据类型的表,以正确处理二进制徽标和一些Unicode信息。首先,我们尝试使用SSMS的表设计器,但拒绝这样做:


我们改为通过SQL代码来完成此操作,如下所示:

ALTER TABLE dbo.pub_info ALTER COLUMN Logo varbinary(MAX) NULL;
ALTER TABLE dbo.pub_info ALTER COLUMN PR_Info nvarchar(MAX) NULL;


当然,通常情况下,我们通常会对每个版本进行很多更改,但这仅说明了各个阶段。和我们一起承担。

经过大量测试(检查),并检查数据是否未更改,我们确定这是一个新版本,并将更新后的表放在源代码管理中,如下所示:

  1. 标记新的开发版本2.1.6
  2. 使用SQL Compare将更改部署到GitHub,以构建数据库(2.1.6)为源,并以GitHub Build目录为目标。选择“ 创建部署脚本 ”并将其保存到GitHub中的脚本文件夹中;这是我们的“第一手”迁移脚本(在GitHub中:migration_2-1-5_to_2-1-6.sql)。执行它以更新GitHub源中的Build目录。



SQL Compare提供给我们的这个第一手迁移脚本比通过敲入代码所能做到的更加有条理。我们发现,ALTERSSMS不允许我们使用表Designer / editor进行的声明确实可以在没有特殊迁移代码的情况下完成。


在这种情况下,我们需要做的就是在自动生成的脚本中添加一个小陷阱,这意味着我们不会在错误的版本上执行代码。

SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL Serializable
GO
BEGIN TRANSACTION;
--inserted code
Declare @version varchar(25);
SELECT @version= Coalesce(Json_Value(
 ( SELECT Convert(NVARCHAR(3760), value) 
   FROM sys.extended_properties AS EP
   WHERE major_id = 0 AND minor_id = 0 
    AND name = 'Database_Info'),'$[0].Version'),'that was not recorded');
IF @version <> '2.1.5'
 BEGIN
 RAISERROR ('The Target was at version %s, not the correct version (2.1.5)',16,1,@version)
 SET NOEXEC ON;
 END
--end of inserted code
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering [dbo].[pub_info]'
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
ALTER TABLE [dbo].[pub_info] ALTER COLUMN [logo] [varbinary] (max) NULL
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
ALTER TABLE [dbo].[pub_info] ALTER COLUMN [pr_info] [nvarchar] (max) COLLATE Latin1_General_CI_AS NULL
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating extended properties'
GO
BEGIN TRY
    EXEC sp_addextendedproperty N'Database_Info', N'[{"Name":"Pubs","Version":"2.1.6","Description":"The Pubs (publishing) Database supports a fictitious bookshop.","Modified":"2020-05-15T13:30:11.697","by":"RED-GATE\\Tony.Davis"}]', NULL, NULL, NULL, NULL, NULL, NULL
END TRY
BEGIN CATCH
    DECLARE @msg nvarchar(max);
    DECLARE @severity int;
    DECLARE @state int;
   SELECT @msg = ERROR_MESSAGE(), @severity = ERROR_SEVERITY(), @state = ERROR_STATE();
    RAISERROR(@msg, @severity, @state);
    SET NOEXEC ON
END CATCH
GO
COMMIT TRANSACTION
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
-- This statement writes to the SQL Server Log so SQL Monitor can show this deployment.
IF HAS_PERMS_BY_NAME(N'sys.xp_logevent', N'OBJECT', N'EXECUTE') = 1
BEGIN
    DECLARE @databaseName AS nvarchar(2048), @eventMessage AS nvarchar(2048)
    SET @databaseName = REPLACE(REPLACE(DB_NAME(), N'\', N'\\'), N'"', N'\"')
    SET @eventMessage = N'Redgate SQL Compare: { "deployment": { "description": "Redgate SQL Compare deployed to ' + @databaseName + N'", "database": "' + @databaseName + N'" }}'
    EXECUTE sys.xp_logevent 55000, @eventMessage
END
GO
DECLARE @Success AS BIT
SET @Success = 1
SET NOEXEC OFF
IF (@Success = 1) PRINT 'The database update succeeded'
ELSE BEGIN
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
    PRINT 'The database update failed'
END
GO


我们以当前版本(2.1.5)为目标测试经过编辑的迁移脚本。如果一切顺利,则它将目标的版本标记更新为新版本,因为比较的源已经拥有它。如果一切都不对,您将得到这个…


如果在没有版本号的数据库上运行它,则会得到以下信息:


我们将当前版本与代表当前生产版本的参考版本进行比较(在本例中使用SQL数据比较),发现数据没有变化,但是参考数据库现在处于新版本。我们保存迁移脚本并在GitHub上更新项目版本号:

{
"$schema": "//raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", "version": "2.1.6"
}


最后,我们将包含新版本的构建和脚本的本地GitHub目录推送到源代码管理。

相关产品推荐:

SQL Prompt:SQL语法提示工具

SQL Toolbelt:Red Gate产品套包

SQL Monitor:SQL Server监控工具


想要购买SQL Compare正版授权,或了解更多产品信息请点击


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP