我们公司没有聘用专门的DBA,但确实有选择的开发人员执行DBA功能。我们经常在开发周期中更新我们的数据库,并拥有包含各种更新的发布脚本。我们将数据库项目中的数据库模式和对象保存在Visual Studio中。
然而,我们经常遇到两个导致时间密集的人工干预的绊脚石问题:
开发人员无法始终从数据库项目同步到本地数据库,因为如果我们在包含数据的现有表中添加了NOT NULL字段,那么VS到数据库的部署过程不够智能,无法自动生成插入“test”数据只是将字段放入表中(除非这是某个设置的位置?)。我们当然会在可能的情况下使用脚本来填充真实数据字段,但我们不能,因为部署失败。
有时开发人员会从过去的任意日期恢复备份。无法确切知道哪些数据库更新应用于此数据库,因此他们不知道要开始应用哪些脚本。在这种情况下,我们要做的是按时间顺序检查每个脚本,以查看该脚本的更改是否已应用于数据库。如果是这样,请转到下一个要运行的脚本。重复。
我们讨论过的一种方法是在数据库中创建一个“数据库更新级别”表,其中包含1个字段,1行。它将保持数据库已更新的级别。例如,运行第一个脚本时,将级别更新为2.在每个db脚本中,我们将语句包装在一个检查中,例如
IF Database_Update_Level< 2那么 在这做一些事情
UPDATE Database_Update_Level SET Database_Update_Level = 2 结束如果
然后可以在任何数据库上运行db脚本,因为单个语句不会在某个级别以下执行。
这感觉就像我们遗漏了一些东西,因为这一定是每个开发商都可以在本地遇到开发的常见问题。
非常感谢任何见解。
感谢。
答案 0 :(得分:0)
关于还原问题,我没有看到很多解决方案,您可能会尝试阻止完全还原并运行脚本来填充表。对于版本控制结构,你在VS中使用SSDT(SQL Server数据工具)吗?您可以生成DACPAC并生成差异脚本。
但你说的是你还直接在数据库中改变了结构?没办法避免这种情况?如果不是,您可以使用DDL触发器(http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/)来至少获得更改通知。
答案 1 :(得分:0)
解决NOT NULL问题的一种简单方法是建立默认约束(可能只是一个空字符串,数据类型的最大数值,最大日期值等)。发布时,将使用默认值填充新列。
对于第二个问题,我将利用SSDT项目中的部署后脚本,使用“NOT EXISTS”保持数据同步,以进行增量更改。这样,您可以简单地发布数据库并允许数据更新一个接一个地发生。