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

Откуда:
Сообщений: 20
Здравствуйте!
Появилась у меня задача реплицировать данные из одной таблицы TableNameOld на сервере1 в таблицу TableNameNew на сервере2. Использую репликацию транзакций. Вернее, хочу использовать. т.к. получилось настроить только в случае одинаковых названий полей в таблицах. Но в моем случае в TableNameOld есть полe ColumnName_123, которому соответствует поле ColumnName_456 во второй таблице. Можно ли как-нибудь проставить соотвестсвие между полями табличек? Заранее благодарю
14 июл 11, 20:32    [10976426]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
view?
14 июл 11, 20:41    [10976442]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
яя, реплицировать 1:1, но на подписчике сделать представление. возможно, со схемами поиграть, чтобы не было конфликта имен
вариант 2 - трансформация
вариант 3 - хранимки репликационные руками править
14 июл 11, 21:19    [10976572]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
1. Before snapshot script
2. After snapshot script
3. Зарегистрировать для этой таблицы свой генератор репликационных хранимок.

В таком подходе все будет нормально работать и даже alter table для этой таблицы будут нормально проходить.
15 июл 11, 00:09    [10977107]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
имхо, представления - самое простое решение, хоть и не самое эффективное.
15 июл 11, 01:09    [10977252]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Makar4ik
имхо, представления - самое простое решение, хоть и не самое эффективное.
Почему не эффективное???
15 июл 11, 08:52    [10977671]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
Спасибо за советы! Попробую с хранимками поколдовать )
15 июл 11, 09:25    [10977752]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
andsm
1. Before snapshot script
2. After snapshot script
3. Зарегистрировать для этой таблицы свой генератор репликационных хранимок.



<b>andsm</b>, очень прошу, расскажите, пожалуйста, подробнее! Я пол дня промучалась, видимо что-то упускаю. Пункт 3 - это с помощью sp_register_custom_scripting, так? А где должны лежать мои варианты процедур? Я читала http://msdn.microsoft.com/ru-ru/library/ms188010(SQL.90).aspx, но недопоняла этот момент. И еще - все эти три пункта - скрипты до и после создания снимка и генератор - должны быть выполнены в совокупности, или это три разных варианта? (простите, если туплю :( )
15 июл 11, 15:21    [10980564]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а попробовать?
15 июл 11, 15:26    [10980621]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
tusenok
И еще - все эти три пункта - скрипты до и после создания снимка и генератор - должны быть выполнены в совокупности, или это три разных варианта?

Это нужно сделать в совокупности.
15 июл 11, 15:33    [10980710]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
alexeyvg
Makar4ik
имхо, представления - самое простое решение, хоть и не самое эффективное.
Почему не эффективное???
На уровне ощущений. Лишняя "прослойка" при заливании данных.
15 июл 11, 16:38    [10981246]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Makar4ik
alexeyvg
Почему не эффективное???
На уровне ощущений. Лишняя "прослойка" при заливании данных.
Ну какая же это прослойка-то???

Это всё равно что называть прослойкой нотепад, в котором пишется будущий код, и говорить, что для работы приложения использование нотепада будет неэффективно.

Вьюхи-то не исполняюся, нету потерь.
15 июл 11, 16:40    [10981272]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
<b>Crimean</b>, пробую, поверьте! Вот и сейчас пытала разные варианты, но не получается ( поэтому рискую спросить

<b>andsm</b>, в before/after что должно быть? В смысле, я не скрипт прошу, в общем, если можно..
И про генератор хранимок - если я подключаю готовую процедуру, то получаю ошибку expects parameter '@c1', which was not supplied
Или я гоню и в генератор нужно не целиком процедуру запихивать? Не понятно, как же установить соответствие полей.
15 июл 11, 17:01    [10981431]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
tusenok,

Что должно быть в before скрипте для этого случая я как-то сейчас не могу придумать. Похоже, для этого случая он не нужен а нужен для более сложных случаев. В After скрипте нужно переименовать поле из ColumnName_123 в ColumnName_456. Снапшот доставит таблицу на подписчик как она есть, с теми же названиями полей, а потом вы можете их переименовать.

Про генератор хранимок - читать BOL. Готовую процедуру туда разумеется нельзя регистрировать. К тому же, даже если вы ее туда запихнете (вообще-то возможно с некоторой доработкой) - она ведь станет неправильной если добавите новое поле или удалите существующее. Вообще разобраться с этим можно за пару часов - но нужно читать документацию а не пробовать что-то делать не прочитав документацию.
15 июл 11, 17:19    [10981535]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
Я определенно еще не доросла до такого уровня, чтобы разодраться за пару часов (( Однако вроде бы нащупала путь использования генератора. Вроде бы - потому что все равно не вполне получается. Не генерируется моя хранимка, replication monitor говорит, что не найдено поле id_test и показывает текст своей хранимки.

Делаю так (для случая insert)
ALTER procedure [dbo].[gen_script4repl]
		 
AS

     declare @sql table ( sql_line int identity(1,1), sql_text varchar(8000))

     insert @sql select 'if object_id(''[sp_MSins_testtest_repl_pub]'') is not null drop proc [sp_MSins_testtest_repl_pub]'

	insert @sql  select 'GO'

	insert @sql  select ''

	insert @sql  select 'CREATE procedure [dbo].[sp_MSins_testtest_repl_pub]'

	insert @sql  select '@c1 int'
	insert @sql  select ',@c2 int'

	insert @sql  select 'as'

	insert @sql  select 'begin'

	insert @sql  s select 'insert into [dbo].[test_repl_sub](id,test)'
	insert @sql  select ''
	insert @sql  select 'VALUES(@c1,@c2)'

	insert @sql  select 'end'

	select sql_text from @sql  order by sql_line
Затем
exec sp_register_custom_scripting @type = 'insert', @value = N'dbo.gen_script4repl', @publication = 'test_repl_16', @article = 'test_repl_pub'
18 июл 11, 14:18    [10989433]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
заметила сейчас, что пытается создаться не моя хранимая процедура, а некая процедурка с названием sp_MSins_<название таблички>_msrepl_ccs
18 июл 11, 16:11    [10990288]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
tusenok
заметила сейчас, что пытается создаться не моя хранимая процедура, а некая процедурка с названием sp_MSins_<название таблички>_msrepl_ccs
Ваша процедура должна создасться вашим скриптом.

А в настройках репликации нужно указать, чтобы она не создавала свои процедуры, а использовала ваши. Как то так...

Проще всё таки вьюхи будет использовать.
18 июл 11, 17:51    [10991055]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
tusenok
Я определенно еще не доросла до такого уровня, чтобы разодраться за пару часов (( Однако вроде бы нащупала путь использования генератора. Вроде бы - потому что все равно не вполне получается. Не генерируется моя хранимка, replication monitor говорит, что не найдено поле id_test и показывает текст своей хранимки.

Делаю так (для случая insert)
ALTER procedure [dbo].[gen_script4repl]
		 
AS
...

У процедуры gen_script4repl пропущен параметр @artid int.
Должно быть:
ALTER procedure [dbo].[gen_script4repl] @artid int
		 
AS
...
@artid - идентификатор статьи, передается репликацией при вызове хранимки. Это позволяет использовать одну хранимку для множества таблиц. Пример как получить нужную информацию по @artid:
select @table_name = sa.name,
         @ins_cmd = sa.ins_cmd,
         @publisher = @@SERVERNAME,
         @publisher_db = db_name(),
         @publication = sp.name
      from dbo.sysarticles sa
          inner join dbo.syspublications sp on
            sa.pubid = sp.pubid
        where sa.artid = @artid
18 июл 11, 18:57    [10991361]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
alexeyvg
tusenok
заметила сейчас, что пытается создаться не моя хранимая процедура, а некая процедурка с названием sp_MSins_<название таблички>_msrepl_ccs
Ваша процедура должна создасться вашим скриптом.

А в настройках репликации нужно указать, чтобы она не создавала свои процедуры, а использовала ваши. Как то так...

Так тоже можно, но это плохой и ограниченно работоспособный подход, обычно применяемый только из-за нехватки знаний.
18 июл 11, 19:07    [10991418]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Еще нужно проверить что название репликационной хранимки должно быть действительно sp_MSins_testtest_repl_pub. Это можно проверить посмотрев свойства артикла в публикации.
18 июл 11, 19:13    [10991441]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
В свойствах статьи хранимые процедуры действительно называются sp_MSins_testtest_repl_pub (и т.д. для upd/del) То, что репликация пытается создать процедуру я суффиксом _msrepl_ccs, которая объединяет в себе ins и upd, я вижу в replication monitor, когда получаю сообщение об ошибке. Пример текста сейчас выложить не могу, т.к. он на работе остался.
Запрет на создание своих процедур я ставила в порядке эксперимента, на результат не повлияло ((
18 июл 11, 19:35    [10991555]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
Command attempted:
create procedure [dbo].[sp_MSins_testtest_repl_pub_msrepl_ccs]
    @c1 int,
    @c2 int
as
begin
if exists (select * 
             from [test].[test_repl_sub]
            where [id] = @c1)
begin
update [test].[test_repl_sub] set
    [id_test] = @c2
where [id] = @c1
end
else
begin
	insert into [test].[test_repl_sub](
		[id],
		[id_test]
	) values (
    @c1,
    @c2	) 
end
end

(Transaction sequence number: 0x000067CA00005921001D00000000, Command ID: 5)

Error messages:
Invalid column name 'id_test'. (Source: MSSQLServer, Error number: 207)
19 июл 11, 09:16    [10992826]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Хранимки с постфиксом _msrepl_ccs создаются при наличии параллельных DML операций во время работы снапшота.
Создайте снапшот, дождитесь когда он полностью применится, и только затем делайте изменения на издателе.
19 июл 11, 09:54    [10992946]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц, на издателе и подписчике разные названия полей  [new]
tusenok
Member

Откуда:
Сообщений: 20
Спасибо за помощь, все получилось ))
20 июл 11, 12:25    [10999364]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить