Автоинкрементный редактируемый столбец - PullRequest
0 голосов
/ 22 мая 2019

Я ищу лучшее решение проблемы, с которой я столкнулся.

У меня есть несколько баз данных, которые я часто выравниваю, чтобы в них были одни и те же данные. В некоторых ссылочных таблицах есть столбцы идентификатора автоинкремента, а в других таблицах есть столбцы, соответствующие этим значениям идентификатора. К сожалению, на исходных идентификаторах БД после изменений может быть что-то вроде: (10,15,20), тогда как после вставки его в таблицу назначения это равно (1,2,3). Я надеюсь, что мои макеты прояснят ситуацию:

Исходная БД RefTable:

ID_________Name
10_________a
15_________b
20_________c

База данных RefTable:

ID_________Name
1__________a
2__________b
3__________c

Source FactTable:

RefTableID___OtherColumns
10__________a
10__________b
15__________c
15__________d

Проблема в том, что после переноса FactTable в целевую БД он не совпадает с записями из RefTable. У меня была идея добавить еще один столбец, который будет редактироваться в отличие от столбца идентификатора. Проблема заключается в том, что конечный пользователь не должен видеть это (это ничего не будет значить для него), поэтому он также должен иметь автоинкремент. Что я должен использовать в этой ситуации:

  • последовательность
  • -trigger
  • -пост добавить / сохранить хранимую процедуру?

А может, у кого-то есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 22 мая 2019

В SQL Server столбцы идентификаторов не могут быть обновлены после вставки строки в таблицу.

Однако это значение можно вставить вручную, используя set identity_insert для указанной таблицы. В каждом сеансе вы можете иметь только одну таблицу с identity_insert, установленной на on одновременно, поэтому всегда устанавливайте ее обратно на off, как только вставка будет завершена.

Код может выглядеть примерно так:

set identity_insert RefTable on;

insert into RefTable (id, name)
select id, name
from sourceDb.sourceSchema.RefTable s
where not exists (
    select 1
    from RefTable t
    where t.Id = s.Id
);

set identity_insert RefTable off;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...