powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / NOT FOR REPLICATION для IDENTITY поля не работает при репликации???!!!(MS SQL7)
2 сообщений из 2, страница 1 из 1
NOT FOR REPLICATION для IDENTITY поля не работает при репликации???!!!(MS SQL7)
    #32004577
SAMRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!MS SQL7 Tran Repl
Переделал базу - для всех полей IDENTITY дописал NOT FOR REPLICATION и счастливый ждал что у меня все реплицируется, а он мне опять что не может в это поле вставить без IDENTITY_INSERT is ON, так что опять возвращаюсь к процедурам для вставки при репликации, где включаю вставку в идентити,вставляю запись, отключаю вставку.
СКАЖИТЕ КТО НИБУДЬ ДЛЯ ЧЕГО ТОГДА ПИСАТЬ ДЛЯ IDENTITY поля NOT FOR REPLICATION???
...
Рейтинг: 0 / 0
NOT FOR REPLICATION для IDENTITY поля не работает при репликации???!!!(MS SQL7)
    #32004594
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ключ not for replication полезно использовать, когда на реплицирующихся базах существует разделение диапазонов ID колонок. Поясню это на примере. Сначала - без использования not for replication.

Итак, 2 базы. В каждой из них есть таблица

create table t1(
objectID int identity(1, 1) primary key,
objectName nvarchar(100)
)

Налаживаем между ними репликацию таблицы t1. Желательно не постоянную, а "synchronize on demand only" - в этом случае легко будет проследить поведение репликации. И при создании публикации не забудьте сказать, что таблицу не надо грохать и создавать по новой.
Делаем по инсерту в каждую таблицу

insert into test1..t1 (objectName) values ('name1')
insert into test2..t1 (objectName) values ('name2')

В обе таблицы вставились значения с objectID = 1.
И проводим синхронизацию. Получаем отлуп на подписчике, потому что конфликт - ID один и тот же.
--------------------------------------
Изменим ситуацию. Пусть для первой базы identity начинается с 1, а для второй - с 1000

create table test1..t1(
objectID int identity(1, 1) primary key,
objectName nvarchar(100)
)

create table test2..t1(
objectID int identity(1000, 1) primary key,
objectName nvarchar(100)
)

Опять налаживаем репликацию, делаем инсерты (причем в первую таблицу строка вставится со значением ID = 1, а во вторую - ID = 1000), синхронизуем, отлуп не получаем, потому что ID разные. Теперь делаем еще по одному инсерту

insert into test1..t1 (objectName) values ('name11')
insert into test2..t1 (objectName) values ('name22')

И -- внимание!!! -- для таблицы во первой базе identity ПЕРЕСТАВИЛСЯ с 2 на 1001, то есть последующий инсерт в нее приведет к вставке значения с ID = 1001, а не 2, как мы ожидаем. В результате ломается диапазон значений и последующие синхронизации облажаются.
--------------------------------------
И вот теперь меняем структуру таблицы следующим образом:

create table t1(
objectID int identity(1, 1) not for replication primary key,
objectName nvarchar(100)
)

create table t1(
objectID int identity(1000, 1) not for replication primary key,
objectName nvarchar(100)
)

Вот в этом случае после инсертов конфликтов происходить не будет, и identity сбиваться тоже не будет.

В BOL хорошая статья на эту тему: "Use the NOT FOR REPLICATION Option on the IDENTITY Property" Вылезает она сразу же на индекс NOT FOR REPLICATION option.

Сорри, что так много написано, но хотелось проиллюстрировать подробно, шаг за шагом влияние тех или иных параметров.
--------------------------------------
К вопросу о конфликтах identity колонок. Намного удобнее в качестве primary key использовать поле типа uniqueidentifier с default'ом newid(). Смысл тот же самый, а проблем куда меньше. И с репликацией в том числе.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / NOT FOR REPLICATION для IDENTITY поля не работает при репликации???!!!(MS SQL7)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]