我在数据库中有一个表:
其他对MyTable的Id列有外键约束:
我需要按原样备份MyTable。
我要做的任务是数据转换。虽然数据转换在QA中有效,但我们的更改控制要求我们必须实施回滚过程。我不打算按原样恢复该表,但我必须证明我可以在更改控制之前让我进行更改。
系统是实时订单系统。我无法恢复整个数据库,因为许多订单将在更改之间和我知道是否必须恢复之间进行。
我已经想出了如何备份表格。
SELECT * INTO MyTable_Bak FROM MyTable;
但是,恢复表无法正常工作。我不能这样做:
DELETE FROM MyTable
SELECT * INTO MyTable FROM MyTable_Bak;
由于外键限制,上述操作失败。
我不是在寻找一个美元。我知道Red Gate和其他工具可以做到这一点。
我可以使用的工具是:
附加要求
注意:通过这个问题的详细说明,我在写问题时逐个检测到这个问题的较小部分并单独解决了每个问题。我自己保留问题并自行回答或删除吗?由于我没有找到类似的问题和答案,我会保留它。
答案 0 :(得分:0)
SELECT Name, Object_Name(parent_object_id) as [Table]
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('MyTable')
结果是这样的:
Name Table
FKDDED6AECAD1D93C0 MyOtherTable1
FK166B6670AD1D93C0 MyOtherTable2
第2步 - 为每个外键获取Drop和Create
在SQL Server Management Studio Express中,我转到上面列表中的每个表,并执行以下操作:
运行上面创建的两个DROP语句。
ALTER TABLE [dbo].[MyOtherTable1] DROP CONSTRAINT [FKDDED6AECAD1D93C0]
ALTER TABLE [dbo].[MyOtherTable2] DROP CONSTRAINT [FK166B6670AD1D93C0]
第4步 - 恢复表
我使用此查询从备份中恢复表。
SELECT *
FROM MyTable
SET IDENTITY_INSERT dbo.MyTable ON;
TRUNCATE TABLE MyTable ;
INSERT INTO MyTable (Id, Col1, Col2, Col3) -- Specify all columns here
SELECT (Id, Col1, Col2, Col3) -- Specify all columns again here
FROM MyTable_Bak
步骤5 - 恢复外键约束
运行从步骤2开始组合在一起的ALTER TABLE脚本。
ALTER TABLE [dbo].[MyOtherTable2] WITH CHECK
ADD CONSTRAINT [FKDDED6AECAD1D93C0]
FOREIGN KEY([MyTableId]) REFERENCES [dbo].[MyTable] ([Id])
ALTER TABLE [dbo].[MyOtherTable2] CHECK CONSTRAINT [FKDDED6AECAD1D93C0]
ALTER TABLE [dbo].[MyOtherTable2] WITH CHECK
ADD CONSTRAINT [FK166B6670AD1D93C0]
FOREIGN KEY([MyTableId]) REFERENCES [dbo].[MyTable] ([Id])
ALTER TABLE [dbo].[MyOtherTable2] CHECK CONSTRAINT [FK166B6670AD1D93C0]
你的桌子已经恢复了。
如果你知道一种不需要软件的更好方法,请告诉我。