我有一个测试和一个开发服务器。在不丢失数据的情况下,从开发服务器到测试服务器更改表的最简单方法是什么(Drop Table ... Create Table ...)?
答案 0 :(得分:4)
您最好的办法是提出稳固的发布管理流程。
让开发人员为他们所做的每项更改编写发布和回滚脚本。 坚持使用SQL脚本而不是基于GUI的更改。(使用GUI编写脚本 - 没有错误)
通过这样做,当代码完成时,您已准备好从开发到测试的迁移代码,然后使用相同的脚本从测试转移到生产。
通过这样做你可以
我倾向于使用以下文件夹结构
ChangeNo-xxxxx-Description
--> release.bat (sqlcmd script to loop through release folder)
--> rollback.bat (sqlcmd script to loop through rollback folder)
--> release (folder)
---->0001.ChangeDescription.sql
---->0002.ChangeDescription.sql
--> rollback (folder)
---->0001.ChangeDescription.sql
---->0002.ChangeDescription.sql
为了快速测试我的发布过程,我倾向于拍摄数据库快照。测试一个版本。如有必要,请恢复为快照,然后重试。
在环境之间同步模式的最简单方法是使用Red-Gate SQL Compare或Embarcadero DB Change Manager,但是一旦模式同步,您就会知道为什么要进行任何更改或者反转任何变化。做了?
两者都是出色的工具,但您似乎可能希望在您的环境中建立受控的变更流程。
优秀的工具不能替代变更和发布管理。
答案 1 :(得分:2)
如果你想要一些你已经拥有的东西,你可以执行这些步骤
我同意John的意见,您应该开发一个可重复的过程来将任何目标数据库升级到您当前的“GOLD”模式,因为这将是您在客户网站上所做的事情。如果你现在要花一些钱并雇用一些在运营开发部门方面有良好记录的人,你可以长期存钱。
答案 2 :(得分:1)
尝试使用红门SQL Compare和SQL Data Compare
之类的内容或者如果你有SQL Server Express 版本,你可以使用免费的xSQL Lite Edition,它们限于最大数量的表和其他数据库对象 - 但是,嘿,它是免费的! : - )
答案 3 :(得分:1)
我只是试图“投票”John DaCosta的回答 - 但是,唉,我在Stack Overflow上没有足够的声誉能够做到这一点。
但他是对的 - 完全正确。我使用RedGate的SQL工具并强烈推荐它们;但我也赞同约翰的优点,即世界上所有漂亮的工具都无法取代精心定义的发布流程。
所以虽然我不能“投票”约翰的帖子 - 我至少把咖啡杯抬向他的方向。 (无论他在哪里。)
答案 4 :(得分:0)
RedGate有一套可以同步数据库结构和数据的工具。
答案 5 :(得分:0)
所有数据库更改都应该编写脚本(对表的更改应该是alter table而不是删除,如果要保留数据则创建)并放入源代码管理中。然后,特定版本的更改将在该版本的文件夹中。这样做没有很好的替代品,对数据库的更改应该被视为代码更改,就像所有其他代码一样。使用工具进行比较通常是一种不好的方法,因为它不知道哪个chnages属于特定版本,哪些尚未准备好移动到另一个服务器。只有开发人员才知道这一点,因此他们有责任确保发布的所有内容都在源代码控制标记下。一个自动化的工具不会修复你的开发人员的无能,事实上它可能会让事情变得更糟,因为这些东西不应该被提升为prod。
答案 6 :(得分:0)
我同意其他贡献者认为应该有一个稳固的发布流程,但如果您只是想找到问题的快速解决方案,那么您可以执行以下操作:
执行目标数据库的备份(非常重要)。
在开发(源)数据库上,编写DROP& amp;右键单击表脚本表为|,通过SQL Management Studio创建新表DROP和CREATE到|新查询编辑器窗口。确保脚本包含要保留的任何索引和默认值等。请勿执行此脚本。
在测试(目标)数据库上,执行以下SQL:
SELECT * INTO MyTable_temp FROM MyTable
在DESTINATION数据库上执行步骤1中的DROP和CREATE脚本。
在目标数据库上,执行以下SQL(用适当的值替换表和字段名称):
SET IDENTITY_INSERT MyTable ON GO INSERT INTO MyTable ( Field1 , Field2 , Field3 , Field4 , ... ) SELECT ( Field1 , Field2 , Field3 , Field4 , ... ) FROM MyTable_temp SET IDENTITY_INSERT MyTable OFF GO
SELECT COUNT(*) FROM MyTable
DROP TABLE MyTable_temp