0

我们公司没有聘请专门的 DBA,但有选择的开发人员执行 DBA 职能。我们经常在开发周期中更新我们的数据库,并有一个包含各种更新的发布脚本。我们将数据库架构和对象保存在 Visual Studio 中的数据库项目中。

但是,我们经常会遇到两个导致耗时人工干预的绊脚石问题:

  • 开发人员不能总是从数据库项目同步到他们的本地数据库,因为如果我们在包含数据的现有表中添加了一个 NOT NULL 字段,那么 VS 到数据库的部署过程就不够智能,无法自动插入“测试”数据将字段放入表中(除非这是某个地方的设置?)。如果可能的话,我们当然会跟进这一点,用一个脚本来用真实数据填充该字段,但我们不能,因为部署失败。

  • 有时,开发人员会从任何过去的随机日期恢复备份。没有办法确切知道哪些数据库更新应用到了这个数据库,所以他们不知道要开始应用哪些脚本。在这种情况下,我们所做的是按时间顺序检查每个脚本,以查看该脚本的更改是否已应用于数据库。如果是这样,请继续运行下一个脚本。重复。

我们讨论过的一种方法可能是在数据库中创建一个“数据库更新级别”表,其中包含 1 个字段、1 行。它将保持数据库已更新的级别。例如,当第一个脚本运行时,将级别更新为 2。在每个 db 脚本中,我们会将语句包装在检查中,例如

IF Database_Update_Level < 2 THEN 在这里做一些事情

UPDATE Database_Update_Level SET Database_Update_Level = 2 END IF

然后可以在任何数据库上运行 db 脚本,因为单个语句不会在某个级别以下执行。

这感觉就像我们遗漏了一些东西,因为这一定是每个允许开发人员在本地开发的开发商店都会遇到的常见问题。

任何见解将不胜感激。

谢谢。

4

2 回答 2

0

关于还原问题,我没有看到很多解决方案,您可能会尝试阻止完全还原并运行脚本来填充表。至于版本控制结构,您是否在 VS 中使用 SSDT(SQL Server Data Tools)?您可以生成 DACPAC 并生成差异脚本。

但是你说的是你也直接在数据库中改变结构?没有办法避免吗?如果不是,您可以例如使用 DDL 触发器(http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/)至少得到通知改变了。

于 2013-11-14T21:05:12.923 回答
0

One easy way to solve the NOT NULL problem is to establish default constraints (could just be an empty string, max number value for the data type, max date value, etc.). When the publish occurs the new column will be populated with the default value.

For the second issue I'd utilize post-deploy scripts in your SSDT project to keep the data in sync utilizing 'NOT EXISTS' to make incremental changes. That way, you can simply publish the database and allow the data updates to occur one after another.

于 2013-11-15T01:48:57.113 回答