AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Como substituir uma única tabela pela coluna Identity Primary Key de um backup de banco de dados?

  • 772

Eu preciso restaurar uma tabela de um backup. Meu entendimento é que a única maneira de obter uma única tabela de volta ao banco de dados é copiá-la em uma tabela temporária. Em seguida, elimine a tabela antiga e renomeie a nova com o nome antigo. Meu problema vem com esta etapa específica devido à coluna de chave primária ser uma coluna de identidade. A tabela também tem várias restrições de chave estrangeira. Como posso copiar uma tabela do meu banco de dados de backup para o banco de dados original e ainda manter a coluna de identidade da chave primária e todas as restrições externas?

Aqui está minha tentativa de script atual:

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

Quando tento adicionar as restrições de volta, recebo um erro informando:

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'.

EDIT: Algumas informações adicionais. O usuário deste aplicativo excluiu 175 incidentes por acidente. Infelizmente ela não nos contou até duas semanas depois e então não foi encaminhado para nós até quase um mês depois. Os usuários acessam o aplicativo e fazem alterações para que uma restauração completa do banco de dados não seja uma opção. O usuário está solicitando que apenas os incidentes excluídos sejam restaurados. Examinei o banco de dados e notei uma tabela de incidentes com os dados ausentes no banco de dados atual e os 175 registros existentes no banco de dados de backup. Espero que isso forneça um contexto melhor do motivo pelo qual estou tentando restaurar apenas uma única tabela de incidentes. Está começando a parecer que as tabelas adicionais precisam ser restauradas.

sql-server sql-server-2012
  • 1 1 respostas
  • 872 Views

1 respostas

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

    Com base nas informações que você forneceu em sua pergunta, acho que você precisará restaurar um bom backup (com as linhas ausentes para incidentes) em um banco de dados de teste. Você precisará inserir na tabela de Incidentes atual real as linhas ausentes da versão de backup da tabela de Incidentes (certificando-se de usar corretamente o SET IDENTITY_INSERTcomando). Usar SET IDENTITY_INSERT ON permite que valores explícitos sejam inseridos na coluna de identidade de uma tabela, permitindo que você insira as linhas excluídas. Certifique-se de emitir o SET IDENTITY_INSERT OFF depois de concluir suas inserções. Você precisará fazer exatamente a mesma comparação e inserir as tabelas filhas para cada uma das linhas pai que está restaurando, pois as filhas foram excluídas automaticamente quando as linhas pai foram excluídas (devido à exclusão em cascata FKs).

    Depois de abordar todas as tabelas filhas, você poderá adicionar os FKs novamente com CHECK.

    Você pode querer fazer um protótipo disso em um servidor de teste.

    --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

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve