|
Модераторы: Akina |
|
Gwire |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Здравствуйте.
Архитектура: Имеется 2 сервера базы данных MS SQL Server 2012. По структуре обе базы данных, на этих серверах, почти идентичны. Отличаются только первичные ключи (id) записей. При создании таблиц были заданы разные IDENT_SEED IDENTITY(101,100) для таблиц первой и IDENTITY(102,100) для таблиц второй Так все записи, если их свести в одно место, будут иметь уникальные id Базы друг с другом на прямую не общаются. Источник проблемы: Иногда, клиентская программа дает запрос для базы 02: добавить запись, данные для которой вычитаны из базы 01. Id при этом должен быть добавлен без изменений. Отключаю IDENTITY_INSERT. Добавляю запись. Включаю IDENTITY_INSERT. Проблема: SELECT IDENT_CURRENT(<table>) указывает id последней добавленной записи в таблицу. И этот id имеет суффикс базы 01, а не текущей (02). Оно и понятно... Но дальше происходит неприемлемое: При добавлении новой записи, для нее рассчитывается id на основе суффикса "01". Вопрос: * Как задать старый IDENT_CURRENT для таблицы? или * Как не дать INSERT-у изменять IDENT_CURRENT (хотя тут скорее всего никак) ПС: Сам я дошел только до метода, принудительно создать-удалить пустую запись с ключом (старый-id + 100). Но мне этот метод не нравится. Это сообщение отредактировал(а) Gwire - 3.6.2016, 17:07 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Ну вообще-то документация утверждает, что такое должно происходить только в случае, если значение ключевого поля добавленной записи больше текущего значения IDENTITY. Только через CREATE TABLE (в данном случае явно неприменимо) или ALTER TABLE. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Gwire |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Ну, ожидать, что все id будут меньше текущего значения IDENTITY... Скорее всего, по закону подлости (вернее по теории вероятности) такого счастья не будет. Это через ALTER TABLE <table> ALTER COLUMN [id]? Это сообщение отредактировал(а) Gwire - 3.6.2016, 16:19 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
А что, есть другие варианты? Но вообще ВСЁ тобой описываемое мне, например, активно не нравится. Особенно то, что клиенту даны права на DDL, чего бы и близко быть не должно. Так что поскольку случай копирования данных - достаточно "особый", думаю, не будет ничего удивительного, если для этого и код будет "особый". Тогда вставку в таблицу копии записи из второй таблицы лучше оформить хранимой процедурой - пусть именно её код и разрешением вставки в IDENTITY-поле занимается, и DDL выполняет. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Gwire |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Так и сделано - через ХП.
Мне не ясно, что нужно после ALTER COLUMN писать. В доке только ADD и DROP Это сообщение отредактировал(а) Gwire - 3.6.2016, 17:04 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
В том, что ИЗМЕНИТЬ его значение можно с помощью ALTER TABLE, я неправ.
Покопался попристальнее... изменить его может только системная процедура DBCC CHECKIDENT (<table_name>, reseed, <новое_значение>) -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Gwire |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
ПО предварительным результатам решение найдено:
Добавлено @ 17:21 Почти синхронно. Или даже не почти. Для тех у кого возникнет такая же или похожая проблема - курить msdn по DBCC CHECKIDENT https://msdn.microsoft.com/ru-ru/library/ms...v=sql.120).aspx Это сообщение отредактировал(а) Gwire - 3.6.2016, 17:27 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Осталось только обезопасить себя от вставки в другом сеансе...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Gwire |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
||||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Решит... но надо ли реально так строго? читать-то кому надо - пусть себе читают...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |