Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Восстановить IDENT_CURRENT(<table>), после "SET IDENTITY_INSERT <table> OFF" 
V
    Опции темы
Gwire
Дата 3.6.2016, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Akina
Дата 3.6.2016, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(Gwire @  3.6.2016,  15:56 Найти цитируемый пост)
дальше происходит неприемлемое: При добавлении новой записи, для нее рассчитывается id на основе суффикса "01".

Ну вообще-то документация утверждает, что такое должно происходить только в случае, если значение ключевого поля добавленной записи больше текущего значения IDENTITY. 

Цитата(Gwire @  3.6.2016,  15:56 Найти цитируемый пост)
Как задать старый IDENT_CURRENT для таблицы?

Только через CREATE TABLE (в данном случае явно неприменимо) или ALTER TABLE.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gwire
Дата 3.6.2016, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: нет
Всего: 4



Цитата(Akina @  3.6.2016,  15:26 Найти цитируемый пост)
такое должно происходить только в случае, если значение ключевого поля добавленной записи больше текущего значения IDENTITY. 

Ну, ожидать, что все id будут меньше текущего значения IDENTITY... 
Скорее всего, по закону подлости (вернее по теории вероятности) такого счастья не будет.

Цитата(Akina @  3.6.2016,  15:26 Найти цитируемый пост)
или ALTER TABLE

Это через ALTER TABLE <table> ALTER COLUMN [id]?

Это сообщение отредактировал(а) Gwire - 3.6.2016, 16:19
PM MAIL   Вверх
Akina
Дата 3.6.2016, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(Gwire @  3.6.2016,  17:18 Найти цитируемый пост)
Это через ALTER TABLE <table> ALTER COLUMN [id]?

А что, есть другие варианты?

Но вообще ВСЁ тобой описываемое мне, например, активно не нравится. Особенно то, что клиенту даны права на DDL, чего бы и близко быть не должно. Так что поскольку случай копирования данных - достаточно "особый", думаю, не будет ничего удивительного, если для этого и код будет "особый". Тогда вставку в таблицу копии записи из второй таблицы лучше оформить хранимой процедурой - пусть именно её код и разрешением вставки в IDENTITY-поле занимается, и DDL выполняет.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gwire
Дата 3.6.2016, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: нет
Всего: 4



Так и сделано - через ХП.

Мне не ясно, что нужно после ALTER COLUMN писать. В доке только ADD и DROP

Это сообщение отредактировал(а) Gwire - 3.6.2016, 17:04
PM MAIL   Вверх
Akina
Дата 3.6.2016, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



В том, что ИЗМЕНИТЬ его значение можно с помощью ALTER TABLE, я неправ. 

Покопался попристальнее... изменить его может только системная процедура
DBCC CHECKIDENT (<table_name>, reseed, <новое_значение>)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gwire
Дата 3.6.2016, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: нет
Всего: 4



ПО предварительным результатам решение найдено:
Код

DECLARE @OLD_SEED bigint = IDENT_CURRENT('<table_name>');

SET IDENTITY_INSERT <table_name> OFF
INSERT INTO <table_name> bla-bla-bla
SET IDENTITY_INSERT <table_name> ON

DBCC CHECKIDENT ('<table_name>', RESEED, @OLD_SEED);


Добавлено @ 17:21
Цитата(Akina @  3.6.2016,  17:15 Найти цитируемый пост)
Покопался попристальнее

Почти синхронно. Или даже не почти. smile

Для тех у кого возникнет такая же или похожая проблема - курить msdn по DBCC CHECKIDENT
https://msdn.microsoft.com/ru-ru/library/ms...v=sql.120).aspx

Это сообщение отредактировал(а) Gwire - 3.6.2016, 17:27
PM MAIL   Вверх
Akina
Дата 3.6.2016, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Осталось только обезопасить себя от вставки в другом сеансе...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gwire
Дата 3.6.2016, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: нет
Всего: 4



Цитата(Akina @  3.6.2016,  17:37 Найти цитируемый пост)
Осталось только обезопасить себя от вставки в другом сеансе... 

А изоляция таблицы не решит эту проблему?

PM MAIL   Вверх
Akina
Дата 3.6.2016, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Решит... но надо ли реально так строго? читать-то кому надо - пусть себе читают...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1546 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.