我在数据库中有一个表:
- mytable
其他对Mytable的ID列有外键约束:
- myothertable1
- myothertable2
我需要按原样备份mytable。
我要做的任务是数据转换。尽管数据转换在质量检查中有效,但我们的变更控制要求我们必须进行回滚过程。我不打算实际恢复桌子,但是我必须证明我可以在更改控制之前可以进行更改。
系统是一个实行系统。我无法还原整个数据库,因为在进行更改的时间以及我知道是否必须还原的时间之间会通过许多订单。
我已经想出了如何备份表。
SELECT * INTO MyTable_Bak FROM MyTable;
但是,还原表不起作用。我不能这样做:
DELETE FROM MyTable
SELECT * INTO MyTable FROM MyTable_Bak;
由于外键约束,上述失败。
我不是在寻找$ oftware。我知道红色大门和其他工具可以做到这一点。
我可用的工具是:
- SQL Management Studio
- 数据库的管理特权
其他要求
- 在还原后,每一列中的数据最相同。ID,日期等
- 无法删除表
- 无法更改或删除myothertable1或myothertable2中的行。
注意:有了这个问题的详细信息,我逐个地检测到了这个问题的较小部分,因为我编写了问题并分开解决每个问题。我要保持问题并自己回答或删除它吗?由于我没有发现类似的问题和答案,所以我会保留它。
从这里开始答案:http://www.rhyous.com/2017/03/14/back-up-up--up-------restore-a-single-table-table-with-foreign-foreign-foreign-foreign-keys - 使用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-获取下降并为每个外键创建在SQL Server Management Studio Express中,我转到了上面列表中的每个表,并进行了以下操作:
- 在数据库下找到外键|mydb |表|dbo.mytable |钥匙
- 右键单击外键,然后选择脚本密钥作为|掉落并创建到|剪贴板。
- 将其粘贴到查询窗口中。
- 删除使用MyDB语句,并将Drop语句与两个Alter表语句分开。
- 重复下一个外键约束,将下降语句和Alter表语句分组在一起。
运行上面创建的两个下降语句。
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表脚本。
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]
您的桌子已恢复。
如果您知道不需要$ oftware的更好方法,请告诉我。
您可以使用@RhionOus答案,也可以禁用/启用约束。
一种可能的方法是:
- 禁用所有约束或仅特定约束
- 还原表(S)
- 启用所有约束或仅特定约束
注意:注意不要在受约束的列中插入错误的值,否则您将无法对具有不正确数据的表启用约束。您可以在下面使用此脚本,该脚本将帮助您确定哪些约束或启用了哪些约束:
SELECT (CASE
WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED'
ELSE 'DISABLED'
END) AS STATUS,
OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME,
OBJECT_NAME(FKEYID) AS TABLE_NAME,
COL_NAME(FKEYID, FKEY) AS COLUMN_NAME,
OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME,
COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME
FROM SYSFOREIGNKEYS
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO
您可以在下面找到一个有用的帖子的链接:如何使用T-SQL暂时禁用外键约束?