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

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

Хочу сделать публикацию с динамическими фильтрами, при этом не используя
pull подписчиков. Вот хочу спросить насколько реально при push подписке
написать функцию для динамического фильтра. Насколько я понимаю в этом
случае не годятся функции типа host_name() или suser_sname(). Какие свойства
merge агента можно использовать для того, чтобы различать одного подписчика
от другого? Может кто чем поможет?
24 авг 05, 11:45    [1812690]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
Moriarti
Добрый день!

Хочу сделать публикацию с динамическими фильтрами, при этом не используя
pull подписчиков. Вот хочу спросить насколько реально при push подписке
написать функцию для динамического фильтра. Насколько я понимаю в этом
случае не годятся функции типа host_name() или suser_sname(). Какие свойства
merge агента можно использовать для того, чтобы различать одного подписчика
от другого? Может кто чем поможет?


Почему Вы сделали такой вывод? Поля то со значениями host_name() будут заполняться на подписчике и нет разницы, где запускается агент слияния...
24 авг 05, 12:16    [1812869]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Moriarti
Member

Откуда: Ultima Thule
Сообщений: 744
Речь не идет о заполнении полей. Поля уже заполнены. Допустим, в таблице у
меня есть поле filter, которое уже заполнено нужными значениями, например 2
для одного подписчика, 4 для другого. Если бы у меня был статический фильтр
- ябы порсто написал where filter = 2 для одной публикации и filter = 4 -
для другой. Здесь я должен попытаться настроить динамический фильтр, пусть
например есть udf:

create function dbo.dinamicfilter()
returns int
as
begin
declare @result int
select @result = 
case 
when host_name() = 'HOST1' then 2
when host_name() = 'HOST2' then 4
else 0
end
return (@result)
end

Чтобы затем эту udf включить в условие фильтра: where filter =
dbo.dinamicfilter(). Но если у меня будет push подписка, host_name() всегда
будет в этом udf возвращать хост издателя.

Вот и спрашивается как можно написать udf для динамического филтра при push
подписке?
24 авг 05, 13:07    [1813126]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
Moriarti
Речь не идет о заполнении полей. Поля уже заполнены. Допустим, в таблице у
меня есть поле filter, которое уже заполнено нужными значениями, например 2
для одного подписчика, 4 для другого. Если бы у меня был статический фильтр
- ябы порсто написал where filter = 2 для одной публикации и filter = 4 -
для другой. Здесь я должен попытаться настроить динамический фильтр, пусть
например есть udf:

create function dbo.dinamicfilter()
returns int
as
begin
declare @result int
select @result = 
case 
when host_name() = 'HOST1' then 2
when host_name() = 'HOST2' then 4
else 0
end
return (@result)
end

Чтобы затем эту udf включить в условие фильтра: where filter =
dbo.dinamicfilter(). Но если у меня будет push подписка, host_name() всегда
будет в этом udf возвращать хост издателя.

Вот и спрашивается как можно написать udf для динамического филтра при push
подписке?


То, что Вы описали, не имеет отношения к динамическим фильтрам в терминах репликации слиянием.
Почитайте о динамических фильтрах статьи на нашем сайте: https://www.sql.ru/articles/Publications.shtml#08
24 авг 05, 13:19    [1813196]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Moriarti
Member

Откуда: Ultima Thule
Сообщений: 744
Спасибо за помощь! :beer:
24 авг 05, 13:57    [1813388]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
ipeco
Member

Откуда:
Сообщений: 59
Александр Гладченко

То, что Вы описали, не имеет отношения к динамическим фильтрам в терминах репликации слиянием.
Почитайте о динамических фильтрах статьи на нашем сайте: https://www.sql.ru/articles/Publications.shtml#08

Простите за смену ника, это был мой вопрос...
Интересно, почему же не имеет-то? Обычный динамический фильтр, только в качестве фильтра применяется udf-функция, которая должна возвращать в динамике различные значения для разных подписчиков... Единственное, я не использую динамических снапшотов, я вобще не инициализирую подписчиков...
24 авг 05, 15:38    [1813981]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
ipeco
Простите за смену ника, это был мой вопрос...
Интересно, почему же не имеет-то? Обычный динамический фильтр, только в качестве фильтра применяется udf-функция, которая должна возвращать в динамике различные значения для разных подписчиков... Единственное, я не использую динамических снапшотов, я вобще не инициализирую подписчиков...


Обратите внимание на вот эту фразу: "Вы можете использовать UDF в динамическом фильтре, но если UDF включает SUSER_SNAME(), HOST_NAME() или если UDF использует одну из этих системных функций в критериях фильтра (например, MyUDF (SUSER_SNAME ()), тогда UDF становиться статической" в статье: https://www.sql.ru/articles/mssql/02032701FilteringPublishedData.shtml#4
24 авг 05, 15:52    [1814047]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
ipeco
Member

Откуда:
Сообщений: 59
Александр Гладченко

Обратите внимание на вот эту фразу: "Вы можете использовать UDF в динамическом фильтре, но если UDF включает SUSER_SNAME(), HOST_NAME() или если UDF использует одну из этих системных функций в критериях фильтра (например, MyUDF (SUSER_SNAME ()), тогда UDF становиться статической" в статье: https://www.sql.ru/articles/mssql/02032701FilteringPublishedData.shtml#4

Я обратил внимание, и очень удивился. Сказано мощно, но ИМХО немного голословно. Я думаю, что динамическим может считаться тот фильтр, который бы позволял выбирать данные по условию, определяемому текущим подписчиком. Причем эта моя udf прекрасно работает и фильтрует данные, но только при pull подписке, что впрочем тоже понятно.
24 авг 05, 15:57    [1814070]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
У меня работают динамические фильтры, и в них нет ни SUSER_SNAME(), ни HOST_NAME(), ни производных от них, так что утверждение действительно не соответствует истине.

К сожалению, по сути вопроса - как это сделать для push подписок - ничего сказать не могу.
24 авг 05, 16:07    [1814134]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
ipeco
Member

Откуда:
Сообщений: 59
GreenSunrise

У меня работают динамические фильтры, и в них нет ни SUSER_SNAME(), ни HOST_NAME(), ни производных от них, так что утверждение действительно не соответствует истине.

К сожалению, по сути вопроса - как это сделать для push подписок - ничего сказать не могу.

А давайте поставим вопрос по другому: Какие функции(критерии) можно использовать для динамического определения текущего подписчика в текущем сеансе слияния? И вообще, что мне доступно в этом сеансе? Задача ясна - определить, что за подписчик. Решения просто пока не видно...
24 авг 05, 16:25    [1814225]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
ipeco
Я обратил внимание, и очень удивился. Сказано мощно, но ИМХО немного голословно. Я думаю, что динамическим может считаться тот фильтр, который бы позволял выбирать данные по условию, определяемому текущим подписчиком. Причем эта моя udf прекрасно работает и фильтрует данные, но только при pull подписке, что впрочем тоже понятно.


Поэтому то в ответе и говорилось о терминологии, принятой в репликации. В текущей реализации SQL Server динамическими считаются фильтры, которые используют системные функции, возращающие имена хостов или пользователей, но не в UDF. Это может сбить с толку, особенно учитывая, что сервер перестанет считать динамическим фильтром подобную продемонстрированной Вами пользовательскую функцию... Я не знаю, чем вызвано его такое поведение и неприятие использования в UDS таких функций, но если переписать UDF, как советует GreenSunrise, тогда может получиться действительно динамический в терминах SQL Server фильтр.
24 авг 05, 19:41    [1814946]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
vklepko
Member

Откуда:
Сообщений: 144
Александр Гладченко


Обратите внимание на вот эту фразу: "Вы можете использовать UDF в динамическом фильтре, но если UDF включает SUSER_SNAME(), HOST_NAME() или если UDF использует одну из этих системных функций в критериях фильтра (например, MyUDF (SUSER_SNAME ()), тогда UDF становиться статической" в статье: https://www.sql.ru/articles/mssql/02032701FilteringPublishedData.shtml#4



Мне кажется, что оригинал говорит немножко другое:
You can use a user-defined function in a dynamic filter, but unless the user-defined function definition includes SUSER_SNAME(), HOST_NAME(), or the user-defined function evaluates one of these system functions in the filter criteria (such as MyUDF(SUSER_SNAME()), the user-defined function will be static.

...but unless the user-defined function definition includes SUSER_SNAME(), HOST_NAME()..., the user-defined function will be static
правильнее было бы перевести как
...но если UDF НЕ включает SUSER_SNAME(), HOST_NAME()..., то UDF будет статической
25 авг 05, 00:09    [1815167]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Терминология терминологией, но ответа, к сожалению, так и нет. Я не представляю, как в рамках сеанса на _паблишере_ определить, к какому _подписчику_ он коннектится. Агенты-то на паблишере работают.

Есть идея, но бредовая, мне никогда такое реализовывать не приходилось. Попробуйте, вдруг это поможет. При добавлении push подписки одна из страничек визарда - "Set Merge Agent Location". И в ней спрашивается, будет ли агент запускаться на дистрибьюторе или на подписчике. По идее, фишка в том, что управление подписками централизованное, потому что push, но агент физически расположен на подписчике.
25 авг 05, 11:04    [1816057]     Ответить | Цитировать Сообщить модератору
 Re: Построение динамических фильтров для репликации слиянием (merge)  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10753
Блог
vklepko

Мне кажется, что оригинал говорит немножко другое:
You can use a user-defined function in a dynamic filter, but unless the user-defined function definition includes SUSER_SNAME(), HOST_NAME(), or the user-defined function evaluates one of these system functions in the filter criteria (such as MyUDF(SUSER_SNAME()), the user-defined function will be static.

...but unless the user-defined function definition includes SUSER_SNAME(), HOST_NAME()..., the user-defined function will be static
правильнее было бы перевести как
...но если UDF НЕ включает SUSER_SNAME(), HOST_NAME()..., то UDF будет статической


Спасибо за поправку :) я посмотрю всё внимательно и привиду текст к правильному варианту. Если кто - нибудь может высказаться по этому поводу, с удовольствием выслушаю. Также, буду благодарен за любые ссылки по этому вопросу.
Ещё раз, СПАСИБО!
25 авг 05, 15:58    [1817695]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить