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

Откуда: Сидней
Сообщений: 1090
Добрый день!

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

Моя задача изначально создать публикацию некоторым числом таблиц и подписок без инициализации. Я выполняю:
select @sql = 'USE ' + @publicationDB + ' EXEC sp_addsubscription @publication = ''' + @publicationName + ''', @article = N''all'', @subscriber = ''' + @subscriberServerName + ''', @destination_db = ''' + @subscriberDatabaseName + ''', @sync_type = N''replication support only'', @subscription_type = N''push'';'
exec sp_executesql @sql 	


Чтобы избежать синхронизации использую опцию: 'replication support only'

Потом когда надо инициализировать выполняю:

exec sp_reinitsubscription @publication =  @publicationName
    ,@article =  'All'  
    ,@subscriber = @subscriberServerName
    ,@destination_db =  @subscriberDatabaseName
    ,@for_schema_change = 0
    ,@ignore_distributor_failure = 0 
    ,@invalidate_snapshot = 1


Получаю:
автор
Invalidated the existing snapshot of the publication. Run the Snapshot Agent again to generate a new snapshot.
Cannot reinitialize article 'Customer' in subscription 'MyServer\Instance03:AW1' to publication 'Sales' (subscribed with the 'no sync' option).
Cannot reinitialize article 'SalesOrderDetail' in subscription 'MyServer\Instance03:AW1' to publication 'Sales' (subscribed with the 'no sync' option).
Cannot reinitialize article 'SalesOrderHeader' in subscription 'MyServer\Instance03:AW1' to publication 'Sales' (subscribed with the 'no sync' option).
Cannot reinitialize article 'SalesPerson' in subscription 'MyServer\Instance03:AW1' to publication 'Sales' (subscribed with the 'no sync' option).
Cannot reinitialize article 'Store' in subscription 'MyServer\Instance03:AW1' to publication 'Sales' (subscribed with the 'no sync' option).
Job 'MyServer\Instance01-AdventureWorks2008R2-Sales-1370' started successfully.


Пытался использовать sp_changesubscription чтобы изменить @sync_type, но говорит, нет такой опции:
Invalid property name 'sync_type'.


Посдкажите, пжлста, что можно сделать.

Спасибо.
22 май 17, 07:38    [20500151]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
человек_ниоткуда
Guest
Я написал себе такую рыбу (надеюсь будет понятно):
GO
:setvar PubDBName "<publication-db-name>"
:setvar PubName "<publication-srv-name>"
:setvar PubTblName "<object-name-no-quote>"
:setvar PubSchName "<schema-name-no-quote>"
:setvar SubSrvName "<subscriber-srv-name>"
:setvar SubDBName "<subscriber-db-name>"

GO
:on error ignore
GO
:setvar __IsSqlCmdEnabled "True"
GO
IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
BEGIN
	PRINT N'SQLCMD mode must be enabled to successfully execute this script.';
	SET NOEXEC ON;
END

PRINT 'PubDBName         = $(PubDBName)';
PRINT 'PubName           = $(PubName)';
PRINT 'SubSrvName        = $(SubSrvName)';
PRINT 'SubDBName         = $(SubDBName)';
PRINT '---';
GO

-----------------BEGIN: Script to be run at Publisher '$(PubSrvName)'-----------------
USE [$(PubDBName)];
EXEC sp_addpublication @publication = N'$(PubName)', @description = N'Transactional publication of database ''$(PubDBName)'' from Publisher ''(local)''.', @sync_method = N'concurrent', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'true', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'continuous', @status = N'active', @independent_agent = N'true', @immediate_sync = N'true', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_dts = N'false', @replicate_ddl = 1, @allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false', @enabled_for_het_sub = N'false' ;
GO

EXEC sp_grant_publication_access @publication = N'$(PubName)', @login = N'sa';
GO

GO

-- single object publication article (если в публикации только одна статья)
EXEC sp_addarticle @publication = N'$(PubName)', @article = N'$(PubSchName).$(PubTblName)', @source_owner = N'$(PubSchName)', @source_object = N'$(PubTblName)', @type = N'logbased', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @schema_option = 0x000000000D035CDF, @identityrangemanagementoption = N'manual', @destination_table = N'$(PubTblName)', @destination_owner = N'$(PubSchName)', @status = 24, @vertical_partition = N'false', @ins_cmd = N'CALL [sp_MSins_$(PubSchName)$(PubTblName)]', @del_cmd = N'CALL [sp_MSdel_$(PubSchName)$(PubTblName)]', @upd_cmd = N'SCALL [sp_MSupd_$(PubSchName)$(PubTblName)]';

-- multi object publication article
/*--MSSQL генератор скрипта
-- table
SELECT
	REPLACE(REPLACE('EXEC sp_addarticle @publication = N''$(PubName)'', @article = N''?(sch).?(tbl)'', @source_owner = N''?(sch)'', @source_object = N''?(tbl)'', @type = N''logbased'', @description = N'''', @creation_script = N'''', @pre_creation_cmd = N''drop'', @schema_option = 0x000000000D035CDF, @identityrangemanagementoption = N''manual'', @destination_table = N''?(tbl)'', @destination_owner = N''?(sch)'', @status = 24, @vertical_partition = N''false'', @ins_cmd = N''CALL [sp_MSins_?(sch)?(tbl)]'', @del_cmd = N''CALL [sp_MSdel_?(sch)?(tbl)]'', @upd_cmd = N''SCALL [sp_MSupd_?(sch)?(tbl)]'';'
	,	'?(sch)', sc.name)
	,	'?(tbl)', tb.name)
-- 	,	sc.name
-- 	,	tb.name
FROM	
	sys.tables tb
INNER JOIN
	sys.schemas sc
ON	sc.[schema_id] = tb.[schema_id];

-- sql module
SELECT 
	REPLACE(REPLACE(REPLACE(N'EXEC sp_addarticle @publication = N''$(PubName)'', @article = N''?(sch).?(mod)'', @source_owner = N''?(sch)'', @source_object = N''?(mod)'', @type = N''?(typ) schema only'', @description = N'''' , @creation_script = N'''' , @pre_creation_cmd = N''drop'', @schema_option = 0x0000000008000001 , @destination_table = N''?(mod)'', @destination_owner = N''?(sch)'''
	,	'?(sch)', sc.name)
	,	'?(mod)', ob.name)
	,	'?(typ)', CASE ob.[type] WHEN 'P' THEN 'proc' ELSE 'func' END)
-- 	,	sc.name
-- 	,	ob.name
-- 	,	ob.type_desc
FROM	
	sys.objects AS ob
INNER JOIN
	sys.schemas AS sc
ON	sc.[schema_id] = ob.[schema_id]
WHERE	
	ob.[type] IN ('P', 'TF', 'FN', 'IF');
*/
/*--Excel генератор скрипта
="EXEC sp_addarticle @publication = N'$(PubName)', @article = N'" & RC[-2] & "." & RC[-1] & "', @source_owner = N'" & RC[-2] & "', @source_object = N'" & RC[-1] & "', @type = N'logbased', @description = N'', @creation_script = N'', @pre_creation_cmd = N'drop', @schema_option = 0x000000000D035CDF, @identityrangemanagementoption = N'manual', @destination_table = N'" & RC[-1] & "', @destination_owner = N'" & RC[-2] & "', @status = 24, @vertical_partition = N'false', @ins_cmd = N'CALL [sp_MSins_" & RC[-2] & RC[-1] & "]', @del_cmd = N'CALL [sp_MSdel_" & RC[-2] & RC[-1] & "]', @upd_cmd = N'SCALL [sp_MSupd_" & RC[-2] & RC[-1] & "]';"
*/

/*--!!!!!DBG: пример создания статьи с хранимкой и функцией.
EXEC sp_addarticle @publication = N'(m-any)', @article = N'proc_name', @source_owner = N'data', @source_object = N'proc_name', @type = N'proc schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @destination_table = N'proc_name', @destination_owner = N'data'
EXEC sp_addarticle @publication = N'(m-any)', @article = N'func_name', @source_owner = N'data', @source_object = N'func_name', @type = N'func schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @destination_table = N'func_name', @destination_owner = N'data'
*/

--RAISERROR('Add some articles', 11,1);

GO

DECLARE @principal_id INT = -1, @SQL AS NVARCHAR(4000);

WHILE 1=1
BEGIN
	SELECT TOP 1
		@principal_id = principal_id
	,	@SQL = REPLACE(N'DROP ROLE ?(n)', '?(n)', QUOTENAME(name))
	FROM	sys.database_principals
	WHERE	
		[type] = 'R'
	AND	name LIKE 'MSReplPAL[_]%'
	AND	principal_id > @principal_id
	ORDER BY
		principal_id;

	IF @@ROWCOUNT < 1 BREAK;

	EXEC(@SQL);
END;

DROP ROLE [MStran_PAL_role];
GO
-----------------END: Script to be run at Publisher '$(SubSrvName)'-----------------
-- <none>
22 май 17, 12:10    [20500921]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9119
Roust_m
Чтобы избежать синхронизации использую опцию: 'replication support only'

Потом когда надо инициализировать выполняю
Вам что нужно? Просто очистить таблицы на подписчиках?
22 май 17, 12:29    [20500991]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1090
invm,

Нет, сначала настроить репликацию предполагая, что данные там уже есть, а потом реинициализировать репликацию по требованию, если нужно.
24 май 17, 15:04    [20508219]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9119
Roust_m
Нет, сначала настроить репликацию предполагая, что данные там уже есть, а потом реинициализировать репликацию по требованию, если нужно.
Не выйдет.
Изменить sync_type у подписки нельзя. Поэтому, вместо реинициализации, подписки придется пересоздавать.
24 май 17, 15:17    [20508266]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1090
invm
Roust_m
Нет, сначала настроить репликацию предполагая, что данные там уже есть, а потом реинициализировать репликацию по требованию, если нужно.
Не выйдет.
Изменить sync_type у подписки нельзя. Поэтому, вместо реинициализации, подписки придется пересоздавать.


Спасибо, вот это я и хотел понять.
24 май 17, 15:24    [20508290]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1090
человек_ниоткуда,

Дык, а в чем поинт то? Как эта рыба решает проблему?
24 май 17, 15:25    [20508302]     Ответить | Цитировать Сообщить модератору
 Re: Настройка репликации с помощью TSQL  [new]
человек_ниоткуда
Guest
Roust_m
человек_ниоткуда,

Дык, а в чем поинт то? Как эта рыба решает проблему?


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

Эта рыба полностью делает публикацию. привязывай параметры хранимок к своим таблицам и генери публикацию.
С подписками сложнее, там надо ещё Job-ы рулить. Могу дать рыбу, если хошь.
24 май 17, 19:29    [20509207]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить