Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
При помощи Management Studio настроил две базы для одноранговой репликации транзакций в соответствии с
http://msdn.microsoft.com/ru-ru/library/ms152536(v=sql.105).aspx.
Автоматически сгенерировались хранимки для Insert, Update, Delete. Теперь мне хотелось бы изменить их, чтобы добавить свою логику. Как это сделать?

1) Снапшот в соответсвии с рекомендациями был отключен в мастере, поэтому в папке "repldata" пусто и нельзя отредактировать скрипт ХП, как советуется здесь: http://msdn.microsoft.com/ru-ru/library/ms151245(v=sql.105).aspx

2) Напрямую в базе ХП не модифицируется, т.к. там упоминается $sys_p2p_cd_id. (И кстати, в документации о об этом ни слова нет http://msdn.microsoft.com/ru-ru/library/ms152489(v=sql.105).aspx)

3) Можно воспользоваться sp_register_custom_scripting, но ее результат проявится только в случае изменения схемы таблицы
http://msdn.microsoft.com/ru-ru/library/ms152552(v=sql.105).aspx, http://msdn.microsoft.com/ru-ru/library/ms188010(v=sql.105).aspx

Уже третий день хожу по кругу по этим пунктам документации... :(
22 май 12, 10:58    [12592660]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Уточню что оба сервера одинаковые:
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)   Jun 17 2011 00:54:03   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 
22 май 12, 12:02    [12593327]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
-=Гость=-
Guest
Finder,

Зарегистрируйте своего "скриптера" перед добавлением подписчика

тогда
"...Автоматически сгенерировались хранимки для Insert, Update, Delete..."
они будут содержать вашу логику.
22 май 12, 13:07    [12593940]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Насколько я понял, sp_register_custom_scripting даст эффект только при изменении схемы таблицы. А у меня ситуация когда я только что настроил peer-to-peer.

В документации сказано:
Выполните Процедура sp_register_custom_scripting (Transact-SQL) и укажите значение 'insert', 'update' или 'delete' 
для параметра @type, а также имя пользовательской процедуры сценария для параметра @value. 


Имя ХП я могу передать (указать имя можно и через студию - в настройках публикации на диалоге Article Properties\Statement delivery), но вначале надо ее создать.

Но как создать ХП? В образце, который создается автоматически, присутствует последний системный параметр "$sys_p2p_cd_id.". Если я просто попытаюсь создать на ее основе свою ХП
ALTER procedure [dbo].[sp_MSins_dboTest1576826527]
		@c1 bigint,
		@c2 bigint,
	,@MSp2pPostVersion varbinary(32) 
as
begin  
	insert into [dbo].[Test](
		[F_ATTRID],
		[F_OBJID],
		$sys_p2p_cd_id
	) values (
    @c1,
    @c2,

		@MSp2pPostVersion	) 
end

получаю ошибку:
Msg 126, Level 15, State 1, Procedure sp_MSins_dboTest1576826527, Line 9
Invalid pseudocolumn "$sys_p2p_cd_id".
22 май 12, 14:11    [12594612]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Насколько я понял, sp_register_custom_scripting даст эффект только при изменении схемы таблицы. А у меня ситуация когда я только что настроил peer-to-peer.

В документации сказано:
Выполните Процедура sp_register_custom_scripting (Transact-SQL) и укажите значение 'insert', 'update' или 'delete' 
для параметра @type, а также имя пользовательской процедуры сценария для параметра @value. 


Имя ХП я могу передать (указать имя можно и через студию - в настройках публикации на диалоге Article Properties\Statement delivery), но вначале надо ее создать.

Но как создать ХП? В образце, который создается автоматически, присутствует последний системный параметр "$sys_p2p_cd_id.". Если я просто попытаюсь создать на ее основе свою ХП
ALTER procedure [dbo].[sp_MSins_dboTest1576826527]
		@c1 bigint,
		@c2 bigint,
	,@MSp2pPostVersion varbinary(32) 
as
begin  
	insert into [dbo].[Test](
		[F_ATTRID],
		[F_OBJID],
		$sys_p2p_cd_id
	) values (
    @c1,
    @c2,

		@MSp2pPostVersion	) 
end

получаю ошибку:
Msg 126, Level 15, State 1, Procedure sp_MSins_dboTest1576826527, Line 9
Invalid pseudocolumn "$sys_p2p_cd_id".
22 май 12, 14:28    [12594799]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
-=Гость=-
Guest
Finder,

К сожалению опыта с p2p нет, но как я понимаю использование псевдополей будет разрешено для соединения дистрибьюшен агента из под просто соединения из SSMS этого никак не сделать. напишите свой простейший "скриптер/генератор" с использованием псевдополей (для какого-нибуть одного действия IUD) и посмотрите что оно доставляется на подписчика.

Если уж будете использовать свой скриптер вас все равно нужно генерировать репликацию скриптами и вызовами хранимок, вот там то вам и нужно будет вызывать sp_register_custom_scripting
22 май 12, 15:36    [12595413]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
To -=Гость=-:

Т.е. если репликация p2p создана через студию визуально, переопределить какую-то конкретную хранимку (например на INSERT) уже нельзя?
22 май 12, 15:47    [12595496]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
-=Гость=-
Guest
Finder,

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

еще для тестирования своего "скриптера" могу порекомендовать "sp_scriptpublicationcustomprocs"
22 май 12, 15:52    [12595543]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
-=Гость=-
Guest
-=Гость=-,

погуглил по вашей ошибке, вот нашел
http://www.replicationanswers.com/P2PInternals.asp

автор
Invalid pseudocolumn "$sys_p2p_cd_id".

I can however see this extra column if I use the DAC to open up a query editor window and run the following:

select *, $sys_p2p_cd_id as HiddenColumn from TestTable

This now shows:

....


Используйте DAC
22 май 12, 15:56    [12595574]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Провозился с этой проблемой уже порядочное время, немного продвинулся (хотя странно, sp_register_custom_scripting похоже вообще толком не документирована, приходится собирать ифнормацию по кусочкам)...

Оказалось что встроить пользовательскую ХП синхронизации при одноранговой транзакции можно с использованием sp_register_custom_scripting.
exec sp_addarticle @publication = N'REPLTEST', @article = N'TLinkAttr', @source_owner = N'dbo', @source_object = N'TLinkAttr', 
  @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', 
  @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', @destination_table = N'TLinkAttr', 
  @destination_owner = N'dbo', @vertical_partition = N'false', @ins_cmd = N'CALL sp_MSins_dboTLinkAttrU', 
  @del_cmd = N'CALL sp_MSdel_dboTLinkAttr', @upd_cmd = N'SCALL sp_MSupd_dboTLinkAttr'
GO
-- ХП для генерации sp_MSins_dboTLinkAttrU уже создана ранее и называется sp_genMSins_dboTLinkAttr
sp_register_custom_scripting @type='insert', @value='[dbo].[sp_genMSins_dboTLinkAttr]', 
    @publication='REPLTEST', @article=N'TLinkAttr'

и смотрим сразу что в публикации:
select ins_cmd from dbo.sysarticles where dest_table='TLinkAttr'

столкнулся со странностью: "CALL [dbo].[sp_MSins_dboTLinkAttrU422294705]".

После настройки подписки агент в итоге не работает, т.к. пытается вызвать не сгенерированную мной sp_MSins_dboTLinkAttrU а sp_MSins_dboTLinkAttrU422294705.
Можно этот числовой суффикс узнать внутри моей ХП sp_genMSins_dboTLinkAttr? Или наоборот исправить строку в sysarticles?
Как правильно сделать?
29 май 12, 09:13    [12629456]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Еще раз перечитал про параметр @ins_cmd для sp_addarticle:
CALL sp_MSins_table (default)
-или-
CALL custom_stored_procedure_name

Вызывается хранимая процедура, выполняемая на подписчике. Чтобы использовать этот способ репликации, укажите с помощью аргумента schema_option, что хранимая процедура должна быть создана автоматически, или создайте хранимую процедуру в целевой базе данных каждого подписчика на статью. custom_stored_procedure — это имя хранимой процедуры, созданной пользователем. В значении sp_MSins_table вместо части _table указывается имя целевой таблицы. Если указано значение destination_owner, оно присоединяется к началу имени целевой таблицы. Например, для таблицы ProductCategory, принадлежащей на подписчике схеме Production, этот параметр имел бы значение CALL sp_MSins_ProductionProductCategory. Для статьи в одноранговой топологии репликации значение _table дополняется значением идентификатора GUID. Обновление подписчиков с использованием аргумента custom_stored_procedure не поддерживается.

Т.е. имя ХП автоматически дополняется неким GUID. А откуда его взять - не сказано...
29 май 12, 10:25    [12629890]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Еще раз перечитал про параметр @ins_cmd для sp_addarticle:
CALL sp_MSins_table (default)
-или-
CALL custom_stored_procedure_name

Вызывается хранимая процедура, выполняемая на подписчике. Чтобы использовать этот способ репликации, укажите с помощью аргумента schema_option, что хранимая процедура должна быть создана автоматически, или создайте хранимую процедуру в целевой базе данных каждого подписчика на статью. custom_stored_procedure — это имя хранимой процедуры, созданной пользователем. В значении sp_MSins_table вместо части _table указывается имя целевой таблицы. Если указано значение destination_owner, оно присоединяется к началу имени целевой таблицы. Например, для таблицы ProductCategory, принадлежащей на подписчике схеме Production, этот параметр имел бы значение CALL sp_MSins_ProductionProductCategory. Для статьи в одноранговой топологии репликации значение _table дополняется значением идентификатора GUID. Обновление подписчиков с использованием аргумента custom_stored_procedure не поддерживается.

Т.е. имя ХП автоматически дополняется неким GUID. А откуда его взять - не сказано...
29 май 12, 13:06    [12631256]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
-=Гость=-
Guest
Finder,

автор
"CALL [dbo].[sp_MSins_dboTLinkAttrU422294705]".


А 422294705 это случайно не ArticleID ?

Что вернет ?
select * from sysarticles where name = 'TLinkAttrU'
29 май 12, 14:13    [12631860]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
Нет, это именно числовой дополнительный суффикс, одинаковый для всех трех ХП с этой статьей (ArtId имеет совершенно другой номер). В виде отдельного поля в sysarticles он нигде не фигурирует. Можно, конечно, внутри генератора sp_genMSins_dboTLinkAttr парсить поле "ins_cmd" и узнавать имя ХП. Но мне кажется, это слишком хакерский путь. Наверняка должен быть более правильный для создания своих ХП при одноранговой репликации транзакций.
29 май 12, 14:42    [12632052]     Ответить | Цитировать Сообщить модератору
 Re: Как создать польз.ХП при одноранговой репликации транзакций?  [new]
Finder
Member

Откуда:
Сообщений: 320
После создания статьи (перед обьявлением собственного генератора ХП) можно восстановить желаемое имя ХП:
exec sp_helparticle @publication='REPLTEST', @article='TLinkAttr'
GO
exec sp_changearticle @publication='REPLTEST', @article = 'TLinkAttr', @property='ins_cmd', @value=N'CALL sp_MSins_dboTLinkAttrU'
GO
exec sp_helparticle @publication='REPLTEST', @article='TLinkAttr'
GO
29 май 12, 15:00    [12632198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить