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

Откуда: Tallinn
Сообщений: 576
Вопрос такой: есть на этой вкладке опции - типа заменить команды предложенными процедурами. Хочу поинтересоваться - какой вариант лучше? Желательно с аргументами. Заранее спасибо!
29 авг 05, 13:59    [1825304]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Application Logic in Triggers at the Subscriber
Similarly, additional business logic in user defined triggers at the Subscriber may also slow down the replication of changes to the Subscriber. For transactional replication, it can be more efficient to include this logic in custom stored procedures used to apply the replicated commands.

Use Custom Stored Procedures to Update Subscribers
By default when a Subscriber is set up for transactional replication, the process of applying a snapshot to a Subscriber, in addition to creating the table(s) and populating them, will also create a set of stored procedures at the Subscriber (for INSERT, UPDATE and DELETE).

Subsequently when changes are made to a published table, the log reader will construct a stored procedure call instead of SQL statements representing the change. The distribution agent then executes this while applying changes to a Subscriber. This is much more efficient than SQL statements over which it provides significant performance gains.

These stored procedures can be further customized, which is generally better than adding Subscriber-specific logic in triggers (for actions such as maintaining aggregate tables).

И еще вот это: Using Custom Stored Procedures in Articles
29 авг 05, 15:03    [1825593]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
А что делает сервер, если не использовать процедуры? Стандартные INSERT, DELETE и UPDATE? Чем они хуже? Не пойму...
29 авг 05, 15:09    [1825615]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
А вы перечитайте цитаты еще раз.
29 авг 05, 15:12    [1825635]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
This is much more efficient than SQL statements over which it provides significant performance gains. - Это? Тут какие-то не написано почему либо тут тонкости английского.
29 авг 05, 15:16    [1825660]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Производительность повышают.
29 авг 05, 15:23    [1825701]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
Чем интересно? Тем что выдают ошибку, когда вставка не удалась?
29 авг 05, 15:24    [1825711]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
Просто у меня в БД (к сожалению, разработчик ее уже не работает, да это и не важно) русские названия таблиц да еще и с пробелами. Наверно, это из-за того, что базы переносились с Access. Но тоже опять не важно. Важно то, что эти процедуры тоже получаются с русскими названиями и пробелами в имени. И никакие квадратные скобки не добавляются. Можно конечно ручками, но это как-то некрасиво - а если у меня сотня таблиц и десяток серверов, на которые идет репликация? Все руками менять? Или есть какой-то скрытый смысл, который я никак не пойму?
29 авг 05, 15:39    [1825805]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
select @@version
29 авг 05, 16:19    [1825977]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
bonzadk
Чем интересно? Тем что выдают ошибку, когда вставка не удалась?

Не хочу вас огорчать, но если простой insert не проходит при репликации, то тоже вываливается ошибка. А что вы ожидали, интересно?
29 авг 05, 16:19    [1825982]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
причем тут версия? 2000 сиквел с 4 SP. И как раз простой инсерт прекрасно при репликации работает. А вот эти хитрые процедуры отказываются, потому что в их тексте вот что:
ALTER  procedure "sp_MSupd_Категории Агентов" 
 @c1 smallint,@c2 nvarchar(50),@c3 smallint,@c4 uniqueidentifier,@pkc1 smallint
,@bitmap binary(1)
as
if substring(@bitmap,1,1) & 1 = 1
begin
update "Категории Агентов" set
"AgentCategoryID" = case substring(@bitmap,1,1) & 1 when 1 then @c1 else "AgentCategoryID" end
,"Категория агента" = case substring(@bitmap,1,1) & 2 when 2 then @c2 else "Категория агента" end
,"Базовый процент" = case substring(@bitmap,1,1) & 4 when 4 then @c3 else "Базовый процент" end
,"rowguid" = case substring(@bitmap,1,1) & 8 when 8 then @c4 else "rowguid" end
where "AgentCategoryID" = @pkc1
if @@rowcount = 0
	if @@microsoftversion>0x07320000
		exec sp_MSreplraiserror 20598
end
else
begin
update "Категории Агентов" set
"Категория агента" = case substring(@bitmap,1,1) & 2 when 2 then @c2 else "Категория агента" end
,"Базовый процент" = case substring(@bitmap,1,1) & 4 when 4 then @c3 else "Базовый процент" end
,"rowguid" = case substring(@bitmap,1,1) & 8 when 8 then @c4 else "rowguid" end
where "AgentCategoryID" = @pkc1
if @@rowcount = 0
	if @@microsoftversion>0x07320000
		exec sp_MSreplraiserror 20598
end
29 авг 05, 16:28    [1826032]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Версия нужна затем, что баги могут фикситься с выходом новой версии продукта. У вас ведь на лбу не написано, что SP4, а сами вы эту информацию не сообщаете, вопреки правилам форума. Потому и спрашиваю.

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

Правильный вызов - exec [sp_MSupd_Категории Агентов]...
Неправильный - exec sp_MSupd_Категории Агентов...

Вы уверены, что репликационный агент делает именно неправильный вызов? Вы видите это в профайлере?
29 авг 05, 17:04    [1826190]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
Ошибку агент дистрибуции выдавал.
Syntax error or access violation
(Source: PROG-736 (ODBC); Error number: 37000)
{CALL sp_MSupd_Категории Агентов (NULL,N'Королев Ведущий',NULL,NULL,11,0x02)} 
Transaction sequence number and command ID of last execution batch are 0x0000011E0000033D000500000000 and 1.
А если в профайлере запустить но в таком виде: [sp_MSupd_Категории Агентов] NULL,N'Королев Ведущий',NULL,NULL,11,0x02 то все отлично работает!!!
29 авг 05, 17:13    [1826233]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
тьфу ты! в аналайзере конечно ж... может аська есть? моя 313443253
29 авг 05, 17:15    [1826244]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Не, аськи нету...

Тык-с. Что я могу сказать. Вообще это баг. Агент должен квотировать имена объектов при вызове, а он не квотирует.

Какие могут быть способы решения проблемы:

1. Заявить баг в Microsoft и ждать фикса. Думаю, это не лучший способ. Но зато правильный.

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

Как получить скрипты? В SQL Enterprise Manager'е правой кнопкой на нужной публикации, пункт контекстного меню Generate SQL Script. Возьмете его за основу, потом подточите, что вас не устраивает, пользуясь хелпом по системным процедурам.

3. Отказаться от использования процедур, гнать исходные команды "как есть".
--------------------------------------

Думаю, выбор "процедуры-команды" не был сделан осмысленно. Просто это дефолтная установка для случая, когда все подписчики - SQL Server. Если вы всерьез хотите выбрать одно или другое, вам надо разобраться в том, что делают эти процедуры, возможно, что-то поменять в них, протестить оба варианта, и выбрать наилучший.

--------------------------------------
P.S. Русские буквы и пробелы в именах объектов - плохая практика. Это не первая и не последняя проблема, с которой вы столкнетесь по этой причине. Если есть возможность - измените.
29 авг 05, 17:46    [1826428]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
Знаете что мне непонятно? То, что вызов проц-ы в аналайзере работает когда аргументы не в скобках. Не понимаю. Со скриптованием я попробую, а выбор процедур... я поэтому и спрашивал в начале - чем они лучше? Если все данные изменяются процедурами, в которых сидят эти самые INSERTы и т.д., получается идет вложенный вызов процедур? У-у-у... Переделать таблицы не могу - все работает уже давно... Самый легкий выход - отказаться от этих самых процедур. Спасибо, что помогли разобраться!
29 авг 05, 18:00    [1826510]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
bonzadk
Знаете что мне непонятно? То, что вызов проц-ы в аналайзере работает когда аргументы не в скобках. Не понимаю.

Аргументы??? В каких скобках? Мы вроде говорили о квотировании имени процедуры. Так вот, с квотированным именем вызов проходит нормально, без квотирования, естественно, нет.

Впрочем, если вы решили от процедур отказываться, думаю, этот вопрос для вас уже не важен...
29 авг 05, 18:21    [1826585]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
С квотированием нормально? вот это: sp_MSupd_Категории Агентов (NULL,N'Королев Ведущий',NULL,NULL,11,0x02)?
У меня только когда вот так: [sp_MSupd_Категории Агентов] NULL,N'Королев Ведущий',NULL,NULL,11,0x02
А когда вот так [sp_MSupd_Категории Агентов] (NULL,N'Королев Ведущий',NULL,NULL,11,0x02) не работает
29 авг 05, 18:27    [1826613]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Да вы, похоже, не знаете синтаксиса вызова процедур с параметрами в MS SQL Server :-)

Значит, так.

Параметры процедуры (не функции!) пишутся БЕЗ круглых скобок. Поэтому ваши примеры 1 и 3 из последнего поста работать не могут. Синтаксическая ошибка.

Имя процедуры в вашем случае надо квотировать - иначе как серверу понять, что Агентов - это продолжение имени процедуры, а не первый параметр?

Поэтому единственный рабочий вариант такой:
[sp_MSupd_Категории Агентов] NULL,N'Королев Ведущий',NULL,NULL,11,0x02
29 авг 05, 18:32    [1826626]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Мне очень интересно, как вы до сих пор вызовы процедур с параметрами из T-SQL делали, если не знаете, что их нельзя заключать в круглые скобки...
29 авг 05, 18:33    [1826627]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
Ну уж вот не нада из меня совсем дурака делать )
29 авг 05, 18:42    [1826645]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
А в CALL sp_MSupd_Категории Агентов (NULL,N'Королев Ведущий',NULL,NULL,11,0x02) скобки нада?
29 авг 05, 18:43    [1826650]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Как надо:

exec [sp_MSupd_Категории Агентов] 1, 'sdfsdf', 2, '865B881E-1B0E-4E5A-B010-323FD04CC21A', 3, 0x5

{call [sp_MSupd_Категории Агентов] (1, 'sdfsdf', 2, '865B881E-1B0E-4E5A-B010-323FD04CC21A', 3, 0x5)}

Оба варианта валидны. Первый - T-SQL синтаксис, второй - OBDC'шный.
29 авг 05, 18:54    [1826669]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
bonzadk
Member

Откуда: Tallinn
Сообщений: 576
Спасибо! Завтра продолжим?
29 авг 05, 18:56    [1826677]     Ответить | Цитировать Сообщить модератору
 Re: Вкладка Commands при репликации транзакцией  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Если остались невыясненные вопросы, то, конечно, продолжим :-)
29 авг 05, 18:57    [1826678]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить