如何使用SQL Server

时间:2017-03-14 21:27:10

标签: sql-server foreign-keys backup restore

我在数据库中有一个表:

  • MyTable的

其他对MyTable的Id列有外键约束:

  • MyOtherTable1
  • MyOtherTable2

我需要按原样备份MyTable。

我要做的任务是数据转换。虽然数据转换在QA中有效,但我们的更改控制要求我们必须实施回滚过程。我不打算按原样恢复该表,但我必须证明我可以在更改控制之前让我进行更改。

系统是实时订单系统。我无法恢复整个数据库,因为许多订单将在更改之间和我知道是否必须恢复之间进行。

我已经想出了如何备份表格。

SELECT * INTO MyTable_Bak FROM MyTable;

但是,恢复表无法正常工作。我不能这样做:

DELETE FROM MyTable
SELECT * INTO MyTable FROM MyTable_Bak;

由于外键限制,上述操作失败。

我不是在寻找一个美元。我知道Red Gate和其他工具可以做到这一点。

我可以使用的工具是:

  • SQL Management Studio
  • 数据库的管理员权限

附加要求

  • 恢复后,每列中的数据大致相同。 ID, 日期等。
  • 表格无法删除
  • 无法更改或删除MyOtherTable1或MyOtherTable2中的行。

注意:通过这个问题的详细说明,我在写问题时逐个检测到这个问题的较小部分并单独解决了每个问题。我自己保留问题并自行回答或删除吗?由于我没有找到类似的问题和答案,我会保留它。

1 个答案:

答案 0 :(得分:0)

从这里回答:http://www.rhyous.com/2017/03/14/back-up-and-restore-a-single-table-with-foreign-keys-using-sql-server/

第2部分 - 恢复表

第1步 - 查找外键约束
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中,我转到上面列表中的每个表,并执行以下操作:

  • 在Database |下找到外键MyDb |表| dbo.MyTable |键
  • 右键单击外键,然后选择脚本键作为|删除并创建为|剪贴板。
  • 将其粘贴到查询窗口中。
  • 删除USING MyDb语句并将DROP语句与两个ALTER TABLE语句分开。
  • 重复下一个外键约束,将DROP语句和ALTER TABLE语句组合在一起。
第3步 - 运行DROP语句

运行上面创建的两个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]

你的桌子已经恢复了。

如果你知道一种不需要软件的更好方法,请告诉我。