AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 171959
Accepted
Geoff Dawdy
Geoff Dawdy
Asked: 2017-04-26 08:36:02 +0800 CST2017-04-26 08:36:02 +0800 CST 2017-04-26 08:36:02 +0800 CST

如何用数据库备份中的标识主键列替换单个表?

  • 772

我需要从备份中恢复一个表。我的理解是将单个表返回到数据库中的唯一方法是将其复制到临时表中。然后删除旧表并将新表重命名为旧名称。由于主键列是身份列,我的问题出现在这个特定步骤中。该表还有多个外键约束。如何将备份数据库中的一张表复制到原始数据库中,并仍然保留主键标识列和所有外部约束?

这是我当前的脚本尝试:

CREATE TABLE dbo.Incidents_tmp
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[IncidentAction_ID] [int] NULL,
[IncidentCompromise_ID] [int] NULL,
[IncidentDamage_ID] [int] NULL,
[IncidentReportingEntity_ID] [int] NULL,
[IncidentStatus_ID] [int] NULL,
[IncidentType_ID] [int] NULL,
[IncidentID] [varchar](20) NULL,
[Version] [timestamp] NOT NULL,
 CONSTRAINT [PK_Incidents_tmp] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

SET IDENTITY_INSERT dbo.Incidents_tmp ON
GO

IF EXISTS ( SELECT * 
        FROM DB_old.dbo.Incidents )
INSERT INTO DB_new.dbo.Incidents_tmp 
        ( 
        ID ,
        IncidentAction_ID ,
        IncidentCompromise_ID ,
        IncidentDamage_ID ,
        IncidentReportingEntity_ID ,
        IncidentStatus_ID ,
        IncidentType_ID ,
        IncidentID 
        )
    SELECT 
    ID ,
    IncidentAction_ID ,
    IncidentCompromise_ID ,
    IncidentDamage_ID ,
    IncidentReportingEntity_ID ,
    IncidentStatus_ID ,
    IncidentType_ID ,
    IncidentID ,
    FROM DB_old.dbo.Incidents TABLOCKX
GO

SET IDENTITY_INSERT DB_new.dbo.Incidents_tmp OFF
GO

ALTER TABLE dbo.IncidentSubject DROP CONSTRAINT 
FK_IncidentSubject_Incidents;
ALTER TABLE dbo.IncidentsReportLog DROP CONSTRAINT 
FK_IncidentsReportLog_Incidents;
ALTER TABLE dbo.Incidents DROP CONSTRAINT PK_Incidents;

DROP TABLE DB_new.dbo.Incidents
GO

Exec sp_rename 'Incidents_tmp', 'Incidents'

Exec sp_rename 'PK_incidents_tmp', 'PK_Incidents'


ALTER TABLE [dbo].[IncidentSubject]  WITH CHECK ADD  CONSTRAINT 
[FK_IncidentSubject_Incidents] FOREIGN KEY([Incident_ID])
REFERENCES [dbo].[Incidents] ([ID])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[IncidentSubject] CHECK CONSTRAINT 
[FK_IncidentSubject_Incidents]
GO

当我尝试重新添加约束时,我收到一条错误消息:

Msg 547, Level 16, State 0, Line 1
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_IncidentSubject_Incidents". The conflict occurred in database "DB_new", table "dbo.Incidents", column 'ID'.

编辑:一些额外的信息。该应用程序的用户不小心删除了 175 个事件。不幸的是,她直到两周后才告诉我们,直到将近一个月后才将其发送给我们。用户一直在访问应用程序并进行更改,因此不能选择完整的数据库还原。用户请求仅恢复已删除的事件。我查看了数据库并注意到一个事件表,其中包含当前数据库中缺失的数据以及备份数据库中存在的 175 条记录。希望这能提供一些更好的背景来说明我为什么要尝试只恢复一个事件表。它开始看起来需要恢复其他表。

sql-server sql-server-2012
  • 1 1 个回答
  • 872 Views

1 个回答

  • Voted
  1. Best Answer
    Scott Hodgin - Retired
    2017-04-26T10:14:39+08:002017-04-26T10:14:39+08:00

    根据您在问题中提供的信息,我认为您需要将良好的备份(事件的缺失行)恢复到测试数据库中。您需要将备份版本的事件表中缺失的行插入到实际的当前事件表中(确保正确使用SET IDENTITY_INSERT命令)。使用 SET IDENTITY_INSERT ON 允许将显式值插入到表的标识列中,从而允许您插入已删除的行。确保在完成插入后发出 SET IDENTITY_INSERT OFF。您需要对要还原的每个父行的子表进行完全相同的比较和插入,因为在删除父行时会自动删除子表(由于级联删除 FK)。

    处理完所有子表后,您应该可以使用CHECK.

    您可能希望在测试服务器上对其进行原型制作。

    --Demo IDENTITY_INSERT
    --Create test table
    IF OBJECT_ID('dbo.TestTable') IS NOT NULL
        DROP TABLE dbo.TestTable
    GO
    
    CREATE TABLE [dbo].[TestTable] (
        TestId INT identity(1, 1) NOT NULL
        ,TestColumn VARCHAR(5)
        ) ON [PRIMARY]
    GO
    
    --insert a few test rows
    INSERT INTO TestTable (TestColumn)
    VALUES ('one'),('Two')
    
    --select the two rows - the id values will be 1 and 2
    SELECT * FROM TestTable
    
    --delete the two rows
    DELETE FROM testtable
    
    --set identity_insert on to allow you to explicitly insert id values
    SET IDENTITY_INSERT dbo.TestTable ON
    
    --insert id 1 and 2
    INSERT INTO TestTable (TestId,TestColumn)
    VALUES (1,'one'),(2,'Two')
    
    --set identity_insert off
    SET IDENTITY_INSERT dbo.TestTable OFF
    
    --select the current rows - should be id 1 and 2
    SELECT * FROM TestTable
    
    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve