数据库结构变更是否有版本控制系统?
数据库结构变更是否有版本控制系统?
我经常遇到以下问题。
我正在对项目进行一些更改,需要在数据库中创建新表或列。我进行数据库修改,继续我的工作。通常情况下,我会记下这些更改,以便它们可以在实时系统中复制。然而,我并不总是记得我做了什么更改,也不总是记得写下来。
所以,我推送到实时系统,并得到一个明显的错误,即没有NewColumnX
,唉。
无论这是否是这种情况的最佳实践,是否有用于数据库的版本控制系统?我不关心具体的数据库技术。我只想知道是否存在一个这样的系统。如果它恰好可以与MS SQL Server一起使用,那就太好了。
admin 更改状态以发布 2023年5月23日
我有点老派,使用源文件创建数据库。实际上有2个文件 - project-database.sql 和 project-updates.sql - 第一个用于架构和持久化数据,第二个用于修改。当然,两个都在源代码控制下。
当数据库更改时,我首先在 project-database.sql 中更新主要架构,然后将相关信息复制到 project-updates.sql 中,例如 ALTER TABLE 语句。接下来,我可以将更新应用于开发数据库,进行测试和迭代,直到做好为止。然后,检查文件,再次测试,并应用于生产。
此外,我通常在数据库中有一个表 - Config - 例如:
SQL
CREATE TABLE Config ( cfg_tag VARCHAR(50), cfg_value VARCHAR(100) ); INSERT INTO Config(cfg_tag, cfg_value) VALUES ( 'db_version', '$Revision: $'), ( 'db_revision', '$Revision: $');
然后,我将以下内容添加到更新部分:
UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';
只有重新创建数据库时,db_version
才会改变,db_revision
给我一个指示数据库距离基线有多远。
我可以将更新保留在自己单独的文件中,但是我选择将它们全部混合在一起,并使用剪切和粘贴提取相关部分。需要进行一些更多的清理工作,例如,从 $Revision 1.1 $ 中去除 ':' 以冻结它们。