我的需求是相当基本的,我不想重建轮子.我喜欢编写我的数据库脚本并编写脚本以将其从一个版本更新到下一个版本,即001-create-tables.sql,002-alter-column.sql等.
我想要的是一个简单的工具命令行或MsBuild,它将查看数据库,查看数据库所处的版本(使用某些表约定)并运行编号大于当前数据库版本的文件夹中的所有脚本.如果脚本失败/抛出错误并在此时停止,我也希望该工具回滚一个脚本.
这就是我想要的但我不介意改变我的约定,虽然我想写自己的sql脚本.我也希望该工具是免费的或开源的,因为我不需要太多.由于我的项目是C#,我更喜欢在.Net中构建工具
我们假设我正在对我的数据库进行某种非常重要的更改,这需要"自定义"工作从版本A升级到B.例如,将用户ID列从UUID数据类型转换为Windows域用户名.
如何使其自动部署?也就是说,我想允许开发人员右键单击项目,单击"Deploy"并在他们使用足够老的数据库时执行此逻辑.
我没有在数据库项目中看到任何此类登录的位置 - 似乎没有任何此类"升级脚本"的规定.这真的不可能吗?为了澄清,逻辑显然不能自动生成,但我希望它根据需要自动执行.
当然,第一个逻辑障碍是部署实用程序不知道是否需要更新任何此类逻辑 - 我假设我也可以为此提供逻辑(例如,检查版本表以及是否最新version <5.0,执行此升级,稍后添加新版本行).
这可能吗?我可以使用复杂的自定义更改脚本进行全自动部署吗?没有我必须将我的所有自定义更改逻辑都粘贴到(即将成为)巨大的构建前或构建后脚本中,当然......
sql-server database-project database-versioning visual-studio
我刚刚看了一些关于数据库版本控制的文章,并且在Jeff Atwood的博客中找到了他推荐Visual Studio Team Edition for Database Professionals的博客.他提供了一个试验链接,但唯一的问题是该试验是从2005年开始的.
这个产品是完全独立的Visual Studio版本,还是某种加载项?在任何一种情况下,是否有最新版本?当我谷歌时,我没有看到2012年的任何内容.
我的问题:我应该推出自己的模型版本还是使用其中一个已经存在的版本化宝石?如果我应该使用宝石,哪一个最适合这个应用?
关于我的应用的信息
我的应用程序是一个简单的清单应用程序 有清单和工作,我跟踪响应和提交的用户响应.响应告诉我使用说的是什么("完成",注意"我们需要更多的拖把.")并且提交告诉我何时填写了特定的清单(因为给定的清单可能有很多提交和答复)清单).我会在下面展示我的协会,以防万一.
#checklist.rb
class Checklist < ActiveRecord::Base
has_many :jobs, :through => :checklists_jobs
has_many :submissions
end
#job.rb
class Job < ActiveRecord::Base
has_many :checklists, :through => :checklists_jobs
has_many :responses
end
#response.rb
class Response < ActiveRecord::Base
belongs_to :job
belongs_to :submission
belongs_to :user
end
#submission.rb
class Submission < ActiveRecord::Base
belongs_to :user
belongs_to :checklist
has_many :responses
end
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用版本控制
我想要做的是记录用户对清单上的工作的回应.但是我想确保如果核对表发生变化,我可以重现原始核对清单(带有响应信息).例如,我想确保我可以为所有以前版本的清单回答这个问题:
"清单看起来是什么样的,三个星期二的回复是什么?"
如果我更改清单或其任何工作,我不想失去对该问题的答案.
我认为最好的方法是使用版本控制(用于作业和清单).例如,如果管理员更改了作业(名称或描述),那么我不会更新现有作业,而是创建新版本并保留旧版本.然后我就把旧的东西放在适当的位置,并将清单指向新版本的工作.
我应该使用宝石还是自己卷?
我想要决定的是我是否应该自己滚动(编写代码以增加版本,将所有内容指向版本,并保留以前的版本)或使用现有解决方案.两个最佳解决方案似乎是paper_trail和vestal_versions.我没有足够的声望点来发布两个以上的链接,所以我将链接到每个gem的Railscast(如果你愿意,它会让你进入gem本身).使用paper_trail和Railscast进行Railscast 255撤消和模型版本控制 - 177使用vestal_versions.
推销自己的优点:
我要自己动手:
这看起来很重要,因为不管我决定我基本上都会被困住.我认为以后从一种方法切换到另一种方法并不容易.
gem database-versioning vestal-versions paper-trail-gem ruby-on-rails-3.2
我正在使用Liquibase对现有数据库进行版本控制,所以我正在使用
liquibase \
--logLevel=debug \
--driver=com.mysql.jdbc.Driver \
--classpath=lib/mysql-connector-java-5.1.30.jar \
--url="jdbc:mysql://127.0.0.1:3306/schema" \
--username=user \
--password=pass \
--diffTypes="data" \
--changeLogFile="./data.xml" generateChangeLog
Run Code Online (Sandbox Code Playgroud)
用于生成变更集xml.
这有效,但问题是当我试图运行那些生成的变更集时.我明白了
无法添加或更新子行:外键...'因为变更集的导出顺序不考虑外键.
我的问题是:是否有一个命令选项或能够以正确的顺序生成变更集的东西,还是我应该手动重新排序变更集以获得所需的结果?
更新:
通常,外键应该是在外键之后创建的.但是,在我们的系统中,核心应用程序创建数据库的结构,并且多个客户端应用程序使用它们自己的私有数据在同一数据库中填充数据库.当我们生成数据时,数据更改集按数据库中表的字母顺序生成,这可能是外键约束.我们设法手动安排变更集,但我想知道是否有针对这种特殊情况的更好的解决方法.
我正在使用Django + DRF Web应用程序工作,我想跟踪数据库中所有模型实例的更改,并保留所做的所有更改的日志,即:
TABLE - Table to which record was added/modified
FIELD - Field that was modified.
PK_RECORD - Primary Key of the model instance that was modified.
OLD_VAL - Old Value of the field.
NEW_VAL - New Value of the field.
CHANGED_ON - Date it was changed on.
CHANGED_BY - Who changed it?
REVISION_ID - Revision ID of the current Model Instance.
Run Code Online (Sandbox Code Playgroud)
稍后,我希望用户能够跟踪对模型所做的更改,并查看实例的哪个版本用于特定操作,以便可以跟踪所有内容。
为此,我尝试了解django中用于跟踪数据库模型更改的各种软件包,其中一些在此处列出:
我尝试了django-reversion,django-simple-history,django-audit-log, django-historicalrecords,但是我不明白我应该如何以及为什么使用这些软件包,因为其中有些似乎对要求太高了。因此,经过两天的搜索和阅读有关如何跟踪模型更改的大量帖子,我基本上什么也没做。
我是Django新手,不胜感激。
如果不清楚,请随时评论您的查询。提前致谢 :)
对于我的应用程序,我必须支持更新方案,并且数据库可能会受到影响.
我希望能够在不安装中间版本的情况下从旧版本更新到最新版本.例如假设我有版本A(最旧的),B(中间版)和C版(新版本).我希望能够将版本A直接更新到版本C.对于应用程序文件,这很简单,我只需将旧版本替换为新版本.但是对于数据库,我不希望生成一个SQL脚本来将数据库模式从A直接更改为C,而是我想首先应用脚本将模式从A更改为B,从B更改为C.
如何存储SQL Server数据库的数据库版本?我可以设置任何特殊属性,而不是实现版本表吗?在我的代码(.NET)中,我想读取数据库版本,并相应地以正确的顺序执行更新SQL脚本.
我将使用SQL Server 2005和SQL Server 2008.
我想使用Cassandra的键值对功能。到目前为止,我一直在使用Kyotocabinet,但它不支持多次写入,因此,我想使用Cassandra 对表格数据进行版本控制。
Roll No, Name, Age, Sex
14BCE1008, Aviral, 22, Male
14BCE1007, Shantanu, 22, Male
Run Code Online (Sandbox Code Playgroud)
以上数据为表格(csv)。这是版本 1。接下来是版本 2:
Roll No, Name, Age, Sex
14BCE1008, Aviral, 22, Male
14BCE1007, Shantanu, 22, Male
14BCE1209, Piyush, 22, Male
Run Code Online (Sandbox Code Playgroud)
因此,我将上述版本称为版本 2,并使用以下 diff:
insert_patch:14BCE1209作为键(PK)和14BCE1209, Piyush, 22, Male值。我熟悉表的创建,但无法弄清楚版本控制部分。
在负责任的编程和版本控制的范围内,我想开始对我的数据库更改进行版本控制,特别是因为我正在我的数据库实例上进行开发,然后将其移至生产中.我没有发现任何对我如何做到这一点真正有意义的事情.我使用Visual Studio 2010 Pro作为我的IDE.是否有一个文档使这个过程变得简单并且能够相对容易地检测到对数据库的更改?或者我应该在工作流程中更改哪些内容以使其更容易?
我正在阅读这篇文章以实现表的记录级版本控制。我注意到该架构涉及历史表的使用。但是,我的场景不需要回滚,而是检索时间点记录。这是我尝试使用单个表进行版本控制的设计。请注意,这是一个简单的表数据(没有约束、索引等)。我打算基于 id 建立索引,因为这涉及列上的 group by 子句。
例如,我有一个表 Test ,其中
id 是标识符,
modstamp 是数据的时间戳(绝不为空)
除了上面的列外,该表还将包含簿记列
local_modstamp 是更新记录的时间戳
del_modstamp 是删除记录的时间戳
在备份期间,所有记录均从源获取并插入到记录具有值 local_modstamp = null 和 del_stamp = null 的位置。
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
Run Code Online (Sandbox Code Playgroud)
获得记录后,处理数据的场景如下(假设参考时间[ref_time]是进程运行的时间):
正常插入。
更新:使用 local_modstamp = ref_time 更新最新记录。然后插入新记录。查询将是:更新测试集 local_modstamp = 其中 id = 且 local_modstamp 不为空且 del_modstamp 不为空 插入测试值(...)
删除:用 del_modstamp = ref_time …