11 октября 2012 г.

Восстановление таблицы в ms sql express из бэкапа со старыми ключевыми полями

Есть ms sql express 2005.
Есть некая программа, которая его использует, и для нее имеется база base1.
Программа довольно кривая, но пока от нее не отказаться. Ну да суть не в этом.
Программа многопользовательская.
Пользователи создаются внутри самой программы, но при увольнении сотрудника из программы его не удалить (так уж написал программист..).
Связь с разработчиком программы утрачена.
Был найден выход - удалить ненужных сотрудников в самой таблице базы данных.
Удалили.
Но есть проблема.

Есть несколько таблиц данных:
1. Таблица обращений
2. Таблица операторов
В таблице обращений есть поле, которое связано с ключевым полем-идентификатором таблицы операторов.
При удалении операторов (когда мы удаляем уволившихся сотрудников), в таблице обращений данные по этим операторам остаются, но только с кодом-идентификатором, который ни на что не ссылается.
Соответственно, возникает проблема при получении выборки по обращениям.

Выход - вернуть в таблицу операторов удаленные записи.
Бэкап с этими записями есть.
Данные восстановлены в новую базу данных base2.
Вопрос в том, как перенести данные из таблицы операторов временной базы в таблицу операторов исходной базы.
Записей не так много, можно было бы и руками вбить. Но необходимо, чтобы добавленные записи имели бы точно такое же значение ключевого поля, как было раньше. И с этим возникает проблема, т.к. оно защищено от изменений, как ключевое.

Решаем проблему следующим образом.
1. Копируем таблицу из временной базы в постоянную.
use [base1]
select * into [base1].[dbo].[operators1] from [base2].[dbo].[operators]
2. Копируем данные из таблицы operators1 в таблицу operators базы base1.
set identity_insert [base1].[dbo].[operators] on;
insert into [base1].[dbo].[operators](id,name,department,password,dogovors,disp,expert,admin)
select id,name,department,password,dogovors,disp,expert,admin
from [base1].[dbo].[operators1]
where [base1].[dbo].[operators1].id in (54)
set identity_insert [base1].[dbo].[operators] off;

Либо можно сделать это одним запросом:
set identity_insert [base1].[dbo].[operators] on;
insert into [base1].[dbo].[operators](id,name,department,password,dogovors,disp,expert,admin)
select id,name,department,password,dogovors,disp,expert,admin
from [base2].[dbo].[operators]
where [base2].[dbo].[operators].id in (54)
set identity_insert [base1].[dbo].[operators] off;