Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Информационный Канал Subscribe.Ru


#163<<  #164

СОДЕРЖАНИЕ

1.СЕМИНАР
1.1.MS SQL Server и 1С
2.СОВЕТЫ
2.1.Автоматическое управление диапазонами Identity в репликации слиянием
3.ССЫЛКИ НА СТАТЬИ
3.1.Статьи на русском языке
3.2.Новые и обновлённые технические статьи Microsoft
3.3.Англоязычные статьи
4.ФОРУМ SQL.RU
4.1.Самые популярные темы недели
4.2.Вопросы остались без ответа

СЕМИНАР

MS SQL Server и 1С

Семинар состоится 17 октября 2003 в Учебно-консультационном центре Группы компаний Талгар
в 11-00.

На семинаре будут представлены доклады:

1. Специфика работы 1C под Microsoft SQL server.
Сердюк Владимир, SQL.ru

Анотация доклада:

1. Общие сведения о программных продуктах 1С.
2. Вопросы безопасности 1С в контексте работы под MS SQL server.

  • Проблема конекта 1С к БД под логином "sa".
  • Как реализовать под 1С Windowsautorization.
  • Аудит в1С.
3. Внутренняя структура объектов 1С.
  • Описание соответствия Объект 1С - SQL Таблица.
  • Структура индексов.
  • Описание DDS файла
  • Что делать, если 1С указывает на нарушение структуры данных.
4. Прямые запросы к SQL таблицам 1С.
  • Написание SQL запросов к БД 1С.
  • Специфика запросов 1С под MS SQL server.
  • Использование библиотек для прямого доступа к объектам 1С (rainbow.dll).
5. Специфика реализации экранных форм 1С под MS SQL server.
  • Специфика реализации экранных форм 1С под MS SQL server, что лучше один большой запрос или много маленьких? Проблемы отбора в экранных формах 1С.
6. Проблема блокировки журнала транзакций.(_1sjourn)
  • Проблемы блокировок в 1С.
  • Решение проблемы неоправданной нагрузки процессора при ожидании разблокировки _1sjourn. (особенно актуально для терминальных решений).
7. Вопросы оптимизации структуры объектов в контексте работы 1С под MS SQL server.
  • Как правильно строить регистры.
  • Как правильно реализовать отбор по реквизитам.
8. Проблемы обновления конфигурации при использовании механизмов прямого доступа к данным.
  • Процессы изменения объектов MS SQL server при изменении структуры конфигурации 1С.
9. Использование внешних компонент в 1С.
  • Что делать если Вам не хватает клиентского интерфейса 1С, использование внешних компонент.
10. Логирование для БД под 1С.
  • Проблемы аудита данных в 1С.
  • Использование системы триггеров для логирования.
11. Репликация данных для БД под 1С.
  • Описание различных типов репликации.
  • Репликация для БД под 1С.
  • Оценка потерь в производительности при использовании системы триггеров.

2. Adelite:ETL и примеры его использования.
Мамаев Максим Борисович, генеральный директор компании "Аделит"

Анотация доклада:

1. Общая структура решения.
2. Анализ метаданных 1С.
3. Работа с компонентой "Оперативный учет".
4. Работа с компонентой "Бухгалтерский учет".
5. Инкрементальная выгрузка и работа в пакетном режиме.
6. Пошаговый пример создания решения.

Вы можете заранее задать вопрос докладчику или определить темы, которые вы хотели бы обсудить на предстоящем семинаре. Для этого необходимо послать письмо на адрес mssql@talgar.ru.
Если у вас есть предложения по пополнению программы семинара Вашими сообщениями мы ждем их по адресу mssql@talgar.ru. Формат сообщений 20-30 минут, хорошо если будет презентация.

Участие в семинаре бесплатно.

Внимание! Количество участников ограничено. Большая просьба направлять на семинар от каждой организации не более двух человек.

Для участия в семинаре необходимо заполнить регистрационную форму на каждого участника семинара и отправить ее по факсу или электронной почте. Также Вы можете заполнить регистрационную форму на нашем веб-сайте. По всем вопросам регистрации , пожалуйста, обращайтесь к менеджеру Хуриленко Оксане. Тел./факс (095) 333-72-13, 128-88-66, 128-93-41

СОВЕТЫ

Автоматическое управление диапазонами Identity в репликации слиянием

Эта статья посвящена анализу работы механизма MS SQL Server 2000, обеспечивающего автоматическое разбиение диапазонов полей identity для участвующих в репликации слиянием таблиц на издателе и подписчиках. Суть решаемой этим механизмом проблемы состоит в том, что значения identity могут устанавливаться и издателем и подписчиком самостоятельно. Часто, такие поля, как identity используются в качестве внешнего ключа. Если тиражировать эти значения средствами репликации слиянием, может произойти нарушение ограничения внешнего ключа. Одинаковые значения, полученные на разных серверах, после слияния вызовут возникновение конфликта. Традиционно, проблема identity в репликации решается путём использования для этого опции NOT FOR REPLICATION и разделения его значений на не пересекающиеся диапазоны для разных база данных. Ещё одним, кардинальным путём решения этой проблемы является замена identity на uniqueidentifier. Существует и стандартное решение, позволяющее доверить разделение диапазонов MS SQL Server, выступающему в роли издателя. Информация об автоматически выделяемых диапазонах хранится в таблице MSrepl_identity_range базы данных distribution.
Для того, что бы издатель автоматически назначал диапазоны identity для таблиц подписчиков и для собственных таблиц, необходимо выполнить при создании публикации несколько очень простых действий:

1. Включить опцию автоматического разделения диапазонов при создании публикации. Это можно сделать в Create Publication Wizard или используя хранимую процедуру sp_addmergearticle.
2. Назначение начальных диапазонов значений для издателя и подписчиков.
3. Назначение порогового значения, которое определяет, когда должен быть назначен новый диапазон. Порог необходим, что бы обеспечить резерв значений для вставки, пока не будет назначен новый диапазон. Установка слишком маленького порогового значения может привести к большому количеству неиспользованных значений identity. Пороговое значение должно подбираться в зависимости от частоты вставок на подписчиках и от частоты расписания синхронизации.

Нужно учитывать, что назначение нового диапазона для каждого подписчика происходит в рамках сеанса репликации. Т.е. если агент репликации слиянием не работает в непрерывном режиме, новый диапазон будет установлен только при успешном запуске агента. Пороговое значение должно учитывать то, что если агент запускается редко, значений выделенного диапазона должно быть достаточно для вставки максимально возможного количества записей, которое вы прогнозируете в интервале запуска агента репликации. Введение порогового значения позволяет иметь резерв на тот случай, когда значения выделенного диапазона закончатся между сеансами репликации. Он нужен что бы операции вставки, т.е. выделение следующего значения identity в рамках установленного диапазона, не заканчивались ошибкой из-за исчерпания диапазона, который может быть назначен только при следующем сеансе репликации.
Проще всего рассмотреть, как это всё работает на живом примере. Для этого, на тестовом сервере создайте три базы данных, содержащие по две одинаковые таблицы. Ниже представлен скрипт, исполнение которого в Query Analyzer позволит выполнить эти предварительные шаги:


/***** Начало скрипта *****/
use master
GO
-- База для издателя
CREATE DATABASE [identitytest]
GO
-- База для первого подписчика
CREATE DATABASE [subscriber1]
GO
-- База для второго подписчика
CREATE DATABASE [subscriber2]
GO
-- Создание таблиц
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
use [identitytest]
GO
-- Таблица для издания
CREATE TABLE [dbo].[1testtable] (
 [idrows] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
 [dbname] [char] (20) NULL ,
 [rowguid]  uniqueidentifier ROWGUIDCOL  NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[1testtable] WITH NOCHECK ADD 
 CONSTRAINT [PK_1testtable] PRIMARY KEY  CLUSTERED 
 ([rowguid]) ON [PRIMARY] 
GO
ALTER TABLE [dbo].[1testtable] ADD 
 CONSTRAINT [DF_1testtable_rowguid] DEFAULT (newid()) FOR [rowguid]
GO
-- Таблица аудита значений IDENTITY
CREATE TABLE [dbo].[2audittable] (
 [idrows] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
 [dbname] [char] (20) NULL ,
 [rowguid] [uniqueidentifier] NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[2audittable] ADD 
 CONSTRAINT [PK_2audittable] PRIMARY KEY  NONCLUSTERED 
 ([rowguid])  ON [PRIMARY] 
GO
-- Триггер, заполняющий таблицу аудита
CREATE TRIGGER [NEWROW] ON dbo.[1testtable] 
FOR INSERT NOT FOR REPLICATION  
AS 
INSERT INTO [2audittable] (rowguid, dbname) 
SELECT rowguid, dbname FROM inserted
GO
-- Таблицы для подписчиков полностью повторяют таблицы на издателе
use [subscriber1]
GO
CREATE TABLE [dbo].[1testtable] (
 [idrows] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
 [dbname] [char] (20) NULL ,
 [rowguid]  uniqueidentifier ROWGUIDCOL  NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[1testtable] WITH NOCHECK ADD 
 CONSTRAINT [PK_1testtable] PRIMARY KEY  CLUSTERED 
 ([rowguid])  ON [PRIMARY] 
GO
ALTER TABLE [dbo].[1testtable] ADD 
 CONSTRAINT [DF_1testtable_rowguid] DEFAULT (newid()) FOR [rowguid]
GO
CREATE TABLE [dbo].[2audittable] (
 [idrows] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
 [dbname] [char] (20) NULL ,
 [rowguid] [uniqueidentifier] NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[2audittable] ADD 
 CONSTRAINT [PK_2audittable] PRIMARY KEY  NONCLUSTERED 
 ([rowguid])  ON [PRIMARY] 
GO
CREATE TRIGGER [NEWROW] ON dbo.[1testtable] 
FOR INSERT NOT FOR REPLICATION  
AS 
INSERT INTO [2audittable] (rowguid, dbname) 
SELECT rowguid, dbname FROM inserted
GO
use [subscriber2]
GO
CREATE TABLE [dbo].[1testtable] (
 [idrows] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
 [dbname] [char] (20) NULL ,
 [rowguid]  uniqueidentifier ROWGUIDCOL  NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[1testtable] WITH NOCHECK ADD 
 CONSTRAINT [PK_1testtable] PRIMARY KEY  CLUSTERED 
 ([rowguid])  ON [PRIMARY] 
GO
ALTER TABLE [dbo].[1testtable] ADD 
 CONSTRAINT [DF_1testtable_rowguid] DEFAULT (newid()) FOR [rowguid]
GO
CREATE TABLE [dbo].[2audittable] (
 [idrows] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
 [dbname] [char] (20) NULL ,
 [rowguid] [uniqueidentifier] NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[2audittable] ADD 
 CONSTRAINT [PK_2audittable] PRIMARY KEY  NONCLUSTERED 
 ([rowguid])  ON [PRIMARY] 
GO
CREATE TRIGGER [NEWROW] ON dbo.[1testtable] 
FOR INSERT NOT FOR REPLICATION  
AS 
INSERT INTO [2audittable] (rowguid, dbname) 
SELECT rowguid, dbname FROM inserted
GO
SET QUOTED_IDENTIFIER OFF 
GO
/***** Конец скрипта *****/

Теперь приступим к организации репликации в рамках одного сервера между тремя базами данных. Для этого, в начале, нужно назначить издателя/дистрибутора. В представленных ниже примерах, использовался сервер с именем DBA. Вместо этого имени Вы будете указывать имя компьютера, на котором установлен Ваш тестовый сервер. На первом рисунке, средствами мастера "Configure Publishing, Subscribers, and Distribution" указываем сервер DBA, как дистрибутора.

После того, как сервер определён дистрибутором, в том же мастере указываем этот же сервер издателем.

После того, как мастер успешно закончит свою работу, в окне мастера должны появиться две новые закладки, Publication Databases и Subscribers. Если это произошло, необходимо разрешить издание базы данных identitytest, как это показано на следующем рисунке:

Следующим шагом, необходимо разрешить серверу DBA быть подписчиком для нашего сервера - издателя. Для этого, необходимо перейти на закладку Subscribers и пометить сервер DBA, как подписчика.

После успешного завершения указанных выше операций, приступим к созданию публикации. Для этого воспользуемся мастером Create Publication Wizard:

В рамках этой статьи будут представлены не все шаги мастера. Те из шагов, где применимы предлагаемые мастером по умолчанию значения или опции, представлены здесь не будут.
Для публикации мы выбираем базу данных identitytest, как это показано на следующем рисунке:

Указываем, что у нас будет репликация слиянием.

В качестве издаваемой статьи для нашей публикации указываем таблицу 1testtable и нажимаем на кнопку с многоточием, обведённую на нижеследующем рисунке красным овалом.

В раскрывшемся окне, переходим на закладку Identity Range и устанавливаем размеры диапазонов для издателя и подписчиков равными 10. В нашем случае, заведомо очень маленькое значение размеров диапазонов выбрано исключительно из соображений наглядности следующих ниже тестовых примеров. Порог переключения мы также изменим со стандартного 80% на 90%.

Для полноты понимания, давайте рассмотрим, что означают расположенные на этой закладке объекты:

Automatically assign and maintain a unique identity range for each subscription - опция, которая заставляет SQL Server назначать диапазоны identity издателем и для каждой подписки выбранной статьи.
Maximum identity value - максимально - возможное значение identity для этой таблицы.
Next range starting value - следующее доступное начальное значение identity.
Identity Increment - приращение, с которым будут генерироваться значения identity.
Range size of Publisher - размер диапазона identity, зарезервированный для операций вставки на издателе.
Range size of Subscribers - размер диапазона identity, зарезервированный для операций вставки на подписчиках.
Assign a new range when this percentage of values is used - когда вставляемые значения для этой статьи достигают указанного тут процента от существующего диапазона identity, SQL Server назначит новый диапазон identity.

Обратите внимание, что изменения значений, показанных на этой закладке, затрагивает все статьи, основанные на этой таблице. Все статьи для всех публикаций, которые основаны на этой таблице, будут использовать эти же свойства диапазона identity.

После завершения создания публикации, не забудьте включить логин, от имени которого стартует Ваш MSSQLServer и его агента или логин, через который будет работать репликация, в Publication Access List. Сделать это можно в свойствах публикации, как показано на следующем рисунке.

После того, как публикация настроена, можно приступить к созданию подписок. Мы создадим две подписки, для разнообразия, первая будет push, а вторая pull.
Для этого воспользуемся соответствующими мастерами, также представленными в оснастках Enterprise Manager. Поскольку тестовый сервер у нас один, он же будет выступать и в роли подписчика.

В качестве базы данных для push подписки выбираем subscriber1.

Для простоты демонстрации работы примеров, включим агента слияния в непрерывный режим работы.

Поскольку у нас ещё пустые таблицы и они абсолютно идентичны, от первоначальной инициализации можно отказаться.

После успешного завершения мастером создания первой подписки, создаём вторую, pull подписку, воспользовавшись для этого Pull Subscription Wizard, в котором необходимо указать созданную нами ранее публикацию.

Базой данных назначения в этом случае будет subscriber2.

Как и при организации первой подписки, от первоначальной инициализации отказываемся.

Агента слияния запускаем в непрерывном режиме.

После успешного создания мастерами публикации и подписок, можно приступать к моделированию автоматического назначения диапазонов identity. Предварительно убедитесь, что задания для агента слияния запущены и работают в непрерывном режиме без ошибок.
Далее, заполним таблицу 1testtable, располагающуюся в издаваемой базе данных identitytest, тестовыми данными. Представленный ниже скрипт вставляет в указанную таблицу 20 записей. Запустите на исполнение в Query Analyzer этот скрипт, подключившись к тестовому серверу.


/***** Начало скрипта *****/
use [identitytest]
GO
declare @count_insert int
SET @count_insert = 0
WHILE @count_insert < 20
BEGIN
  SET @count_insert = (@count_insert + 1)
  PRINT 'Вставляется ' + CONVERT(varchar(4), @count_insert) + '-я строка'
  insert [1testtable] (dbname) VALUES ('identitytest')
END
GO
exec sp_adjustpublisheridentityrange identitytest
GO
/***** Конец скрипта *****/

Обратите внимание на последние сообщения, выдаваемые в окне Results Panel:


Вставляется 20-я строка
Server: Msg 548, Level 16, State 2, Line 1
The identity range managed by replication is full and must be updated by a replication agent. 
The INSERT conflict occurred in database 'identitytest', table '1testtable', column 'idrows'. 
Sp_adjustpublisheridentityrange can be called to get a new identity range.
The statement has been terminated.

Во первых, настораживает то, что успешно было вставлено 19 записей, хотя размер диапазона для издателя был нами установлен в 10 записей. Практика показывает, что при заполнении впервые установленного диапазона identity для издателя, реально допускается вставка удвоенного диапазона издателя за минусом одной записи.
Сообщение об ошибке, которое было получено при вставке 20-й строки, говорит о том, что запись не может быть вставлена из-за превышения установленного диапазона identity. В отличие от подписчиков, для которых новые диапазоны устанавливаются в течении сеанса репликации, для издателя при репликации слиянием нет автоматического механизма установки нового диапазона после достижения порогового значения. Администратор баз данных должен следить за заполнением диапазона и успевать вовремя запускать на исполнение хранимую процедуру sp_adjustpublisheridentityrange, которая устанавливает новые диапазоны для издателя. В конце предыдущего скрипта как раз и вызывается эта процедура. Поэтому, при повторном его исполнении вставка записей всё-таки произойдёт, хотя вставлено уже будет не 19, а 9 записей, опять на одну запись меньше, чем величина диапазона. Во всех дальнейших случаях установки новых диапазонов для издателя, правило достижения порога будет срабатывать именно таким образом.

Синтаксис процедуры следующий:

sp_adjustpublisheridentityrange [ @publication = ] 'publication'
             [ @table_name = ] 'table_name'
             [ @table_owner= ] 'table_owner'

Для других типов репликации (транзакционной и моментальными снимками) возможно автоматическое выделение диапазонов и для издателя, которое происходит при работе Log Reader Agent, и для подписчиков, которое происходит при работе Distribution Agent. Поскольку в репликации слиянием не используется Log Reader Agent, а распределение выполняется Merge Agent, автоматизация выделения нового диапазона для издателя полностью ложится на плечи администратора баз данных.
Теперь заполним аналогичной тестовой информацией таблицу на первом подписчике. Здесь мы видим, что удачно вставлены 9 записей и так будет во всех последующих вызовах представленного ниже скрипта. Без ошибок будет вставляться на одну запись меньше, чем величина диапазона.


/***** Начало скрипта *****/
use [subscriber1]
GO
declare @count_insert int
SET @count_insert = 0
WHILE @count_insert < 20
BEGIN
  SET @count_insert = (@count_insert + 1)
  PRINT 'Вставляется ' + CONVERT(varchar(4), @count_insert) + '-я строка'
  insert [1testtable] (dbname) VALUES ('subscriber1')
END
GO
/***** Конец скрипта *****/

Для полноты картины, нам осталось заполнить тестовыми данными таблицу третьего подписчика. Выполните и этот скрипт.


/***** Начало скрипта *****/
use [subscriber2]
GO
declare @count_insert int
SET @count_insert = 0
WHILE @count_insert < 20
BEGIN
  SET @count_insert = (@count_insert + 1)
  PRINT 'Вставляется ' + CONVERT(varchar(4), @count_insert) + '-я строка'
  insert [1testtable] (dbname) VALUES ('subscriber2')
END
GO
/***** Конец скрипта *****/

Как Вы видите из представленных в окне Results Panel сообщений, заполнение таблицы на втором подписчике происходит так же, как и у первого, т.е. вставляется на одну запись меньше, чем величина диапазона. Можно было бы ожидать, что диапазон будет изменён издателем при достижении порогового значения, но это не происходит потому, что даже при запуске агента слияния (Merge Agent) в непрерывном режиме, он подключается к издателю дискретно. А поскольку мы вставляем записи очень быстро, агент не успевает договориться с издателем о выделении нового диапазона. Наш эксперимент можно повторить, назначив для агента репликации расписание запуска или переведя его в режим ручного запуска (отсутствие расписания для задания, запускающего агента слияния). Если мы будем вставлять 9 записей и после этого запускать сеанс репликации агента слияния, диапазон будет изменён.
При разработке схемы репликации с автоматическим выделением диапазонов identity необходимо учитывать возможность заполнения всего выделенного диапазона и рассчитывать расписание запуска агента репликации таким образом, что бы исключить такую возможность.
Теперь давайте сравним значения identity, которые были получены при автоматическом выделении диапазонов с тем, как они могли бы выделяться без этого механизма. Для этого нам понадобится пересечение таблиц 1testtable и 2audittable объединенное по всем базам данных. В наших примерах мы не создавали явных связей между указанными таблицами, эта связь по полю rowguid поддерживалась логикой работы триггера, который заполнял таблицу аудита. Ниже представлен скрипт, который наглядно позволяет получить необходимое нам пересечение и объединение:

/***** Начало скрипта *****/
SELECT   [identitytest].dbo.[1testtable].idrows
         AS [Диапазоны репликации],
         [identitytest].dbo.[2audittable].idrows
         AS [Порядковый номер],
         [identitytest].dbo.[1testtable].dbname
         AS [База данных]
FROM     [identitytest].dbo.[1testtable]
      INNER JOIN
         [identitytest].dbo.[2audittable]
      ON
         [identitytest].dbo.[1testtable].rowguid = [identitytest].dbo.[2audittable].rowguid
UNION
SELECT   [subscriber1].dbo.[1testtable].idrows
         AS [Диапазоны репликации],
         [subscriber1].dbo.[2audittable].idrows
         AS [Порядковый номер],
         [subscriber1].dbo.[1testtable].dbname
         AS [База данных]
FROM     [subscriber1].dbo.[1testtable]
      INNER JOIN
         [subscriber1].dbo.[2audittable]
      ON
         [subscriber1].dbo.[1testtable].rowguid = [subscriber1].dbo.[2audittable].rowguid
UNION
SELECT   [subscriber2].dbo.[1testtable].idrows
         AS [Диапазоны репликации],
         [subscriber2].dbo.[2audittable].idrows
         AS [Порядковый номер],
         [subscriber2].dbo.[1testtable].dbname
         AS [База данных]
FROM     [subscriber2].dbo.[1testtable]
      INNER JOIN
         [subscriber2].dbo.[2audittable]
      ON
         [subscriber2].dbo.[1testtable].rowguid = [subscriber2].dbo.[2audittable].rowguid
/***** Конец скрипта *****/

В результате исполнения скрипта мы получим таблицу, сгруппированную по базам данных и отсортированную по identity. В первой колонке будут значения identity, полученные при автоматическом выделении диапазонов издателем. Во второй колонке будут значения identity из таблицы аудита, которые устанавливались без автоматического выделения диапазонов, как это происходит обычным образом, без репликации. В третьей колонке располагаются имена баз данных.

Диапазоны
репликации
Порядковый
номер
База
данных
1 1 identitytest
2 2 identitytest
3 3 identitytest
4 4 identitytest
5 5 identitytest
6 6 identitytest
7 7 identitytest
8 8 identitytest
9 9 identitytest
10 10 identitytest
11 11 identitytest
12 12 identitytest
13 13 identitytest
14 14 identitytest
15 15 identitytest
16 16 identitytest
17 17 identitytest
18 18 identitytest
19 19 identitytest
21 1 subscriber1
22 2 subscriber1
23 3 subscriber1
24 4 subscriber1
25 5 subscriber1
26 6 subscriber1
27 7 subscriber1
28 8 subscriber1
29 9 subscriber1
31 1 subscriber2
32 2 subscriber2
33 3 subscriber2
34 4 subscriber2
35 5 subscriber2
36 6 subscriber2
37 7 subscriber2
38 8 subscriber2
39 9 subscriber2

Эта таблица наглядно демонстрирует, как функционирует механизм автоматического выделения диапазонов издателем и чем его работ отличается от обычного заполнения поля identity.

Выводы

При использовании в схеме репликации слиянием механизма автоматического выделения диапазонов для полей identity необходимо учитывать следующие важные моменты:

1. Администратор баз данных должен отслеживать заполнение выделенного для издателя диапазона и обеспечить его своевременное переключение вызовом процедуры sp_adjustpublisheridentityrange.
2. Расписание сеансов репликации должно составляться так, что бы не допустить исчерпания выделенного подписчику диапазона в перерывах между этими сеансами.
3. Администратор баз данных должен разработать план мероприятий по обеспечению работоспособности базы данных подписчиков, в случае длительной потери или перерывов связи между подписчиками и издателем, когда выделенный издателем диапазон значений identity для подписчика может быть исчерпан.

[В начало]

ССЫЛКИ НА СТАТЬИ

Статьи на русском языке

Пространство имён Rsdn.Framework.Data
Игорь Ткачёв
Rsdn.Framework.Data является пространством имён, содержащим набор классов, представляющих собой высокоуровневую обёртку над ADO.NET. Казалось бы, ADO.NET сама по себе штука достаточно высокоуровневая и зачем над ней ещё городить какой-то огород? Всё это так, но как это часто бывает, в борьбе добра со злом обычно, увы, побеждает лень...

[В начало]

Новые и обновлённые технические статьи Microsoft

"Connection Could Not Be Established" Error Message When You Connect to a Windows NT 4.0-Based Computer That Is Running SQL Server 2000 or SQL Server 7.0
BUG: Cursor with UPDLOCK Hint May Leave Object in Open State
BUG: NOT FOR REPLICATION Clause Causes SQL Server CE Replication to Fail
BUG: SQL Server CE Filtered Recordset Permits Navigation Outside Filter
BUG: SQLOLEDB Incorrectly Converts Char Data When AutoTranslate Is Turned On
BUG: SQLOLEDB Provider Ignores or Removes Trailing Spaces from Password on the Connection Open Method
DOC: English Query 2000 Tutorials Errata
Embedded SQL for C Application Fails When It Experiences a Lock Timeout Error
FIX: A Deadlock Occurs If You Run an Explicit UPDATE STATISTICS Command
FIX: A Query That Causes a Hash Bailout May Return Incorrect Results
FIX: A Query That Causes Hash Role Reversal May Return Incorrect Results
FIX: A Query That Uses a Hash Match with a Residual Predicate Might Return Incorrect Results
FIX: An Access Violation Occurs When You Run DBCC UPDATEUSAGE on a Database That Has Many Objects
FIX: Bcp.exe Ignores -R Regional Settings Switch When Using Format File (-f)
FIX: Connection Failure With VIA/GigaNet Protocol
FIX: Delayed Domain Authentication May Cause SQL Server to Stop Responding
FIX: Error 1203 Is Reported in the SQL Server Error Log When You Run the xp_sendmail Stored Procedure
FIX: Insertion of NULL Values into NTEXT Columns May Cause Application Instability
FIX: Parallel Query That Uses an Indexed bit Column May Return Results That Are Not Correct
FIX: SQLNumResultCols Results in Attentions Being Generated on SQL Server
How to Include Other MMCs in SQL Enterprise Manager MMC
HOW TO: Create a Database, a Table, and Run a Query (SQL Server CE Sample)
HOW TO: Store and Retrieve an Image File with SQL Server CE and eVB
HOWTO: Bind the Office Chart Component to a PivotTable
HOWTO: Rebuild or Move MSDTC Used with a SQL Failover Cluster
INF: International Considerations in Applications Developed for SQL Server 2000 Windows CE Edition
INF: SQL Server 2000 Kerberos Support Including SQL Server Virtual Servers on Server Clusters
INF: SQL Server 2000 Windows CE Edition Component Releases and Versions
INF: SQL Server CE Relay
INF: Using SQL Server 2000 with FIPS 140-1 Ciphers
INFO: Troubleshooting Tips for T-SQL Debugger in Visual Studio .NET
OSE: Error Messages When You Install Office Server Extensions on Computer with SQL Server 2000
PRB: Error Occurs on RDA.LocalConnectionString When You Use a Large String
PRB: How to Recover SQL Server After a Tempdb Database is Marked Suspect
PRB: Meta Data ODBC Calls Fail on SQL Server Queries with Parameter Markers in Sub-Selects
PRB: OEM to ANSI Translation Fails While Creating New DSN
PRB: SQL Server COM Object Persistence Model
PRB: Windows NT Account Lockout with SQL Server CE Replication and Invalid Password
Support WebCast: Accessing and Manipulating Data in Microsoft SQL Server 2000 Databases by Using SQLXML UpdateGrams
Support WebCast: Analyzing Optimal Compiled Plan Caching
Support WebCast: Cascading Referential Integrity Constraints in SQL Server 2000
Support WebCast: Effective Indexing and Statistics with SQL 2000
Support WebCast: How to Collect and Analyze Performance Data in Microsoft SQL Server
Support WebCast: Inside Microsoft SQL Server 6.5 Replication
Support WebCast: Microsoft SQL Server 2000 Analysis Services: How to Connect to Analysis Services over the Internet
Support WebCast: Microsoft SQL Server 2000 Log Shipping
Support WebCast: Microsoft SQL Server 2000 Transactional Replication: Queued Updating Subscription
Support WebCast: Microsoft SQL Server 2000 Virtual Server Basic Setup, Maintenance, and Service Pack Installation
Support WebCast: Microsoft SQL Server 2000 Virtual Server: Things You Should Know
Support WebCast: Microsoft SQL Server 2000: Alternate Synchronization Partner
Support WebCast: Microsoft SQL Server 2000: How to Configure SSL Encryption
Support WebCast: Microsoft SQL Server 2000: Merge Replication Enhancements
Support WebCast: Microsoft SQL Server 2000: New XML Features
Support WebCast: Microsoft SQL Server 2000: Understanding Backup and Restore
Support WebCast: Microsoft SQL Server: Rapid Blocker Script Analysis
Support Webcast: Microsoft SQL Server: Slammer Virus Update
Support Webcast: Microsoft SQL Server: Troubleshooting SQL 2000 Virtual Server and Service Pack Setups for Failover Clustering
Support WebCast: Multi-instancing in Microsoft SQL Server 2000
Support WebCast: New Features in XML for Microsoft SQL Server 2000 Web Release 2
Support WebCast: Programming ADO SQLXML to Execute SQLXML Queries
Support WebCast: SQL Server 2000 Database Recovery: Backup and Restore
Support WebCast: SQL Server 2000 Profiler: What's New and How to Effectively Use It
Support WebCast: Troubleshooting Microsoft SQL Mail
Support WebCast: Understanding INSTEAD OF Triggers in Microsoft SQL Server 2000
Support WebCast: Understanding User-Defined Functions in Microsoft SQL Server 2000

[В начало]

Англоязычные статьи

Migrating Logins To Another Server
Gregory Larsen
As part of the normal work a Database Administrator (DBA) will be required to migrate databases between servers. One of the reasons for a migration might be caused, because you are moving an application from a quality assurance (QA) environment to a production environment. Another reason might be your current database server hardware has reached the replacement date and you need to migrate your databases from the current, out-dated server to a new server. Yet another reason might be you are migrating your application from SQL Server 7.0 to SQL Server 2000. For what ever the reason you will more than likely have to deal with migrating not only the data, but the SQL Server logins that access that data as well
SQL 2000 and Web Services (XML and SQL part 11)
Marcin Policht
In the last article of this series, we will focus on Web Services and their implementation in the SQL Server 2000 environment with the help of the SQLXML component. In particular, we will look into a non-programmatic way of publishing SQL Server 2000 stored procedures, user-defined functions and XML templates as Web Services. Note that this functionality requires the SQLXML component version 3.0 (currently at Service Pack 1 level), downloadable from the Microsoft Web Site
Troubleshooting SQL Server Alerts
Alexander Chigrik
If you have problems with Microsoft SQL Server alerts, review this troubleshooting checklist to find potential solutions.
The Evolution of Web Services - Part 2
Adnan Masood
Besides SoBig and W32.Blaster.Worm, the latest hot news remains "WS-I Publishes Basic Profile .0" (http://boston.internet.com/news/article.php/2247551). Both news items pertain to the distributed-computing arena. The prior piece is distributed denial of service (DDoS) and later one is distributed EDI. As the name suggests, this article is about the later one. It digs into Web services for EDI and provides some examples and code
Compare two SQL Server tables
Preethiviraj Kulasingham
If you need to compare the data in two tables -- either from the same database or from different databases or even from different servers -- this procedure can help
How to search for date and time values using Microsoft SQL Server 2000
Bryan Syverson
Suppose you’re writing a query to find all the invoices that were written on January 6, 2003. You know from the control totals that 122 invoices were written that day
Save Database Trips
Bill Wagner
Use the System.Data.DataSet class to ease database code creation and deliver more features. Technology Toolbox: C#, SQL Server 2000, ADO.NET. The .NET Framework System.Data.DataSet class contains features that can save you time when you create database-enabled applications. Using the DataSet class makes your application more robust when the database changes or moves to a Web service. It also limits bottlenecks at the database because the connection doesn't need to be open as often
Worst Practice - Spaces in Object Names
Andy Warren
I've written a few articles now about various Worst Practices - things that make your life harder for no good reason! This week is a fairly simple one - which means it should be easy to prevent. Spaces in object names. SQL supports them of course, you just put the object name in brackets, like so
White Board, Flip Chart, or Notepad?
Andy Warren
Occasionally we stray just a little bit from pure SQL articles and delve into related areas. If you haven't guessed yet, this is one of those occasions
How SQL Server is hacked
David Litchfield
This excerpt is from SQL Server Security, written by David Litchfield and published by McGraw-Hill/Osborne Media. Read the entire chapter here. Database servers are a soft target for hackers even though they should be the most secure boxes within an organization's IT infrastructure. Customer information, human resources data—pretty much everything that lends itself to the continued success of the organization is stored in its database. Yet the one place that's designed to keep this information safe and accessible is the thing that ends up allowing the data to be compromised. How is Microsoft SQL Server hacked? The answer to this question depends on by whom, why, and where the hacking is done
Check the isolation level of any SPID
Paul Wehland
By default, each SQL Server 2000 (I'm using SP3a) SPID has a Transaction Isolation Level of 'READ COMMITTED'. You can easily check your own Transaction Isolation level by executing DBCC USEROPTIONS. You will see isolation level in the set option column, and its current setting in the Value column. This will show up only if you execute SET TRANSACTION ISOLATION LEVEL 'nnn'. If you do not see this row, then you are running at the default isolation level of READ COMMITTED. DBCC USEROPTIONS is good only for your own spid
Web Services in Action
Rich Rollman
Web services provide a standard way to build loosely coupled applications that are resilient to change, can be easily described using Web Services Description Language (WSDL), and will make you rich overnight. OK, I exaggerated on that last point. But Web services do provide a new way to expose the valuable data stored in your SQL Server database to applications inside and outside your company. In "Creating a Web Service," June 2002, InstantDoc ID 24909, I introduced basic Web-services concepts and their relevance to SQL Server professionals. I also provided a simple example of how to invoke Web services support in XML for SQL Server 2000 Web Release 3 (SQLXML 3.0), available for download at http://microsoft.com/sql/default.asp. Building on this information, let's review the Web services support in SQLXML 3.0 and construct a simple Web service by using T-SQL stored procedures. Then, let's walk through an example of how you can use the Web service within an application that uses Microsoft Simple Object Access Protocol (SOAP) Toolkit 2.0
SQL DMO Poster in PDF!
Last year we did a project with Lumigent to create a DMO poster. Part of the agreement allows us to now distribute the PDF version to our readers. It's about a 400k file, print size is 24x36. We hope you DMO users will find it useful
Upgrade to Books Online SP3
Brian Moran
By now, you know that SQL Server 2000 Service Pack 3 (SP3) exists, even if you haven't installed it. However, many people don't realize that a new version of SQL Server 2000 Books Online (BOL) ships with SP3. This full refresh of BOL is separate from SP3, and you can download it at http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp even if you don't plan to apply SP3 right away

[В начало]

ФОРУМ SQL.RU

Самые популярные темы недели

Ваше мнение об упражнениях SELECT на http://sql.ipps.ru
Как у вас организована система прав на доступ к данным?
Нужен Админ MS SQL - на один раз!
очень простой арифметический вопрос про НДС
Tool Вы знаете что твориться на ваших 10-30+ серверах ?
Про audit login
Копирование строк
Naming Convention
WEB Assistant
Транзакция существенно увеличивает скорость обработки?
Вечный вопрос про Microsoft Jet
Передача XML-запроса с помощью диалекта MSSQLXML
IDENT_CURRENT...
Связь таблиц - как правильно?
Выполнение триггеров
Error 602 с чем едят?
Про Update и триггеры
Организация хранения файлов
Протоколы: Name Pipes или TCP/IP?
Запись кириллицы в SQL Server

[В начало]

Вопросы остались без ответа

Официальные стандарты SQL
MS SQL Resource Kit 2000
Ошибка при бэкапе
Как сделать итернет бесплатным
Как сделать итернет бесплатным
А есть у нас знатоки AD?
Взламывай всё подряд
Применение XDR и Xpath --как изменить значение???
Помогаем товарищи!
Не может выполниться NetUserAdd при инсталляции
Помогите с SQL Explorer
MsSQL
РАЗРАБОТЧИКА БД С ЗАРПЛАТОЙ 1000Д приглашаем(Москва)
Репликация: использование горизонтальной фильтрации
pad_index
книга
О Cache Hit Ratio и DISTRIBUTED TRAN
Дайте SQLXML 3.0, а?
оффтопик: RAIMA
SQL Server 2000 for Experienced DBAs
Помогите ! OPENXML из сохраненного ClientDataSet !!
Ошибка типа Database may not be activated yet
Нужна ваша помощь
FIllfactor при Forward Engineering в ErWin для MSSQL 2000
Наименование объектов в SQL Server

[В начало]


Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру Гладченко на адрес: mssqlhelp@pisem.net

sql.ru Описание рассылки

МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное