是否有关于如何在多开发人员/多分支(VCS)环境中成功处理数据库视图迁移的既定实践?
我们一直在使用数据库迁移库来进行所有架构更改,但是当不同代码分支中的不同开发人员改变相同视图时,它们遇到了问题,但它们的起源点是相同的。
每个开发人员都有自己的数据库副本,但由于视图通常需要在迁移中指定整个定义,这意味着当我们对登台或生产数据库运行迁移时,无论运行哪个视图迁移last覆盖以前任何视图迁移中所做的任何更改。
示例:
SELECT 'x'
。SELECT 'x', 'y'
。SELECT 'x', 'z'
。SELECT 'x', 'z'
。SELECT 'x', 'y'
,并且开发人员2的更改已丢失。答案 0 :(得分:2)
对于视图或任何可以随时重新定义的数据库对象(例如函数),我发现的最佳实践是将函数的当前定义存储在自己的文件中,例如{{ 1}};然后,每当开发人员想要更改该视图时,他们就会更改该文件,然后添加样板文件迁移,只需从最新版本重新定义视图(我不知道您是否在Rails中,但不知道,但是这里的想法应该很清楚):
db/views/your_stuff.view.sql
请注意,实际的视图文件应如下所示:
class UpdateYourStuffView < ActiveRecord::Migration
def up
execute File.read("#{Rails.root}/db/views/your_stuff.view.sql")
end
def down
# You could expand this to actually track older versions,
# but that's generally not worth it.
raise ActiveRecord::IrreversibleMigration
end
end
这解决了您的问题,因为工作流程现在是:
CREATE OR REPLACE VIEW your_stuff AS (SELECT 'x' FROM foos);
。SELECT 'x' FROM foos
以反映这一变化;他们的迁移只是运行新视图。答案 1 :(得分:1)
如果他们在不同的代码分支中工作,他们应该使用不同的数据库;当合并分支时,应该解决差异。
那就是说,我认为架构应该被视为它自己的项目&#34;。您提到多个开发人员更改共享VIEW,而不是更改共享dll中常用函数签名的人员。
我的回答是(如果开发还为时已晚)在MySQL用户下连接标准客户端代码,该用户无权更改数据库而不必要;并且有一个&#34;迁移&#34; application / script /使用用户帐户下的连接运行的任何内容,具有更改表,视图,过程等所需的权限...