powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уведомление клиентов об изменениях на сервере
25 сообщений из 38, страница 1 из 2
Уведомление клиентов об изменениях на сервере
    #39852252
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Вопрос несколько потрепан, но найти навскидку удобоваримое и простое решение по сабжу не удалось.
Итак, что имеем. Есть двухуровневое приложение. Предположим, это некий корпоративный календарь. У каждого пользователя есть WinForms приложение. С помощью которого можно создавать события в корпоративном календаре. Пользователи могут руками обновить имеющиеся события календаря. Могут создать новое событие. Не обязательно средствами своего приложения (так получилось :( ). Т.е. единственная точка, в которой известно о создании нового события - это некая хранимая процедура на сервере.
И вот - возникает вопрос. Как на стороне SQL Server можно сгенерировать некое уведомление о создании нового события и передать это уведомление для всех подключенных клиентов?
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852255
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

автори передать это уведомление для всех подключенных клиентов?
сразу в мозг? или другие варианты?
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852257
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852261
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoКак на стороне SQL Server можно сгенерировать некое уведомление о создании нового события и передать это уведомление для всех подключенных клиентов?
Для этого обычно используется трехзвенка, чтобы уведомления рассылал сервер приложений.
В двухзвенке на стороне WinForms-приложения делаете бесконечный пинг, который раз в N секунд/минут/часов вызывает ХП, проверяющую, нет ли для текущего пользователя новых уведомлений. Если есть - показывает.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852264
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKVadim Romanenko,

автори передать это уведомление для всех подключенных клиентов?
сразу в мозг? или другие варианты?

Нет, пока чипы не вживляем, а прямая коммуникация тудой - вроде бы только на совести экстрасенсов :)

Под клиентами подразумевается клиентское приложение
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852266
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinamotoVadim RomanenkoКак на стороне SQL Server можно сгенерировать некое уведомление о создании нового события и передать это уведомление для всех подключенных клиентов?
Для этого обычно используется трехзвенка, чтобы уведомления рассылал сервер приложений.
В двухзвенке на стороне WinForms-приложения делаете бесконечный пинг, который раз в N секунд/минут/часов вызывает ХП, проверяющую, нет ли для текущего пользователя новых уведомлений. Если есть - показывает.

Да, я понимаю, что типичное решение - это трехзвенка. Но у нас - двухзвенка.
Бесконечный пинг - уверен, есть более экономичные решения.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852292
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

читайте по ссылке, которую привёл invm.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852296
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Romanenko,
если нужны экономичные решения, то надо начать с описания того, что планируется экономить.
а в процессе написания окажется, что собсна предложенный бесконечный пинг техически мало чем отличается от других решений.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852321
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy st,

Возможно, Вы и правы. Чем городить вот этот весь огород с SQL Dependency...

Что есть. Компания, занимающаяся спецтранспортировкой людей. Поездки в день считаются в тысячах. Водители в сотнях. Операторов - десятки. Новая поездка может прийти кучей способов, в том числе через руки операторов. Оператор должен знать, если пришла новая поездка на сегодня в течении, ну, скажем, минуты.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852360
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoИ вот - возникает вопрос. Как на стороне SQL Server можно сгенерировать некое уведомление о создании нового события и передать это уведомление для всех подключенных клиентов?Взять в штат програмиста.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852392
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

сервер баз данных - вообще такая штука, которая отвечает на вопросы,но сама из не задаёт. Такова его природа. Это просто бочка с огурцами. Огурцы же в рот сами не запрыгивают? Хотя с галушками был прецедент.
Оповещать должен источник события, а не сервер, все остальное - это вандализм и надругательства.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852398
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ставите любую очередь, пуляете в нее события с сервера, а клиенты пусть на очередь подписываются и разгребают.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852940
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичСтавите любую очередь, пуляете в нее события с сервера, а клиенты пусть на очередь подписываются и разгребают.
Смех в том, что у меня и так используется MSMQ. Но с одной стороны, это, вроде как, устаревшая штука. С другой стороны - я пока не вижу как пулять в MSMQ из хранимой процедуры SQL Server
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852984
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm https://docs.microsoft.com/ru-ru/dotnet/framework/data/adonet/sql/query-notifications-in-sql-server

Пробую реализовать подход SqlDependency. Но почему-то нотификация не приходит. Может кто-то сможет подсказать - почему?

В первую очередь подготовил БД
Код: sql
1.
ALTER DATABASE MyDatabase SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE



При старте формы выполняется код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
        public frmMain()
        {
                ...
                test();
        }

        private void test()
        {
            AddSQL2Monitor("select [pk_id] from [dbo].[tbDispLeg]");
        }

        public void AddSQL2Monitor(String sqlRequest)
        {
            if (!CanRequestNotifications())
                throw new Exception("App has no SqlClientPermission -> Can't use SQL Dependency");
            AddDataMonitor(sqlRequest);
        }

        private bool CanRequestNotifications()
        {
            // In order to use the callback feature of the
            // SqlDependency, the application must have
            // the SqlClientPermission permission.
            try
            {
                SqlClientPermission perm =
                    new SqlClientPermission(
                    System.Security.Permissions.PermissionState.Unrestricted);

                perm.Demand();

                return true;
            }
            catch
            {
                return false;
            }
        }



Собственно, попытка добавления нотификации:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
        private void AddDataMonitor(String sqlRequest)
        {
            if (connection == null)
            {
                connection = new SqlConnection(GetConnectionString());
            }
            if (connection.State != ConnectionState.Open) connection.Open();
            command = new SqlCommand(sqlRequest, connection);

            SqlDependency.Start(command.Connection.ConnectionString);
            command.Notification = null;
            new SqlDependency(command).OnChange += new OnChangeEventHandler(dependency_OnChange);
            DataTable table = new DataTable();
            using (SqlDataAdapter sqlDA = new SqlDataAdapter(command))
                sqlDA.Fill(table);
        }
    

        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            command.Notification = null;
            new SqlDependency(command).OnChange += new OnChangeEventHandler(dependency_OnChange);
            DataTable table = new DataTable();
            using (SqlDataAdapter sqlDA = new SqlDataAdapter(command))
                sqlDA.Fill(table);
        }



Ни одного вызова dependency_OnChange не происходит. Как думаете - что не так?
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852994
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoС другой стороны - я пока не вижу как пулять в MSMQ из хранимой процедуры SQL Server Posting Message to MSMQ from SQL Server
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39852996
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgVadim RomanenkoС другой стороны - я пока не вижу как пулять в MSMQ из хранимой процедуры SQL Server Posting Message to MSMQ from SQL Server

Да,спасибо, тоже уже нашел эту статью. Навскидку не завелась. Да и пока хочу попробовать через Dependency
Плюс пообщался с коллегами - вроде MSMQ имеет неприятные глюки. Время от времени. Когда очередь зависает и не пропускает сообщения через себя. Так что тут скорее нужно будет переводить проект уж сразу на другие очереди. Ну или может заведется Sql Dependency :)
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853015
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgVadim RomanenkoС другой стороны - я пока не вижу как пулять в MSMQ из хранимой процедуры SQL Server Posting Message to MSMQ from SQL Server
Нуууу. Так не интересно.
В таком разе можно сразу CLR процедуру написать.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853024
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsteralexeyvgпропущено...
Posting Message to MSMQ from SQL Server
Нуууу. Так не интересно.
В таком разе можно сразу CLR процедуру написать.Ага, CLR ещё лучше, они как раз для таких задач.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853805
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто в курсе - можно ли как-то выдать гранты одновременно для любого юзера, который подключается через Windows Authentication? Для существующих и будущих юзеров? Возможно, есть какой-то подходящий псевдоним? А то что-то нотификации не приходят. И есть подозрение, что проблема в этом моменте:

support.microsoft.comThe user must have the correct client and server side permissions to request and receive notifications.
Users who execute commands requesting notification must have SUBSCRIBE QUERY NOTIFICATIONS database permission on the server.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853823
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoКто в курсе - можно ли как-то выдать гранты одновременно для любого юзера, который подключается через Windows Authentication? Для существующих и будущих юзеров? Возможно, есть какой-то подходящий псевдоним? А то что-то нотификации не приходят. И есть подозрение, что проблема в этом моменте:

support.microsoft.comThe user must have the correct client and server side permissions to request and receive notifications.
Users who execute commands requesting notification must have SUBSCRIBE QUERY NOTIFICATIONS database permission on the server.А "паблику" не подойдёт?
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853834
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Или не подошло, или этот SqlDependency вообще странно работает. Уже несколько раз перебрал и код, и документацию - единственное к чему можно прикопаться, это вот эти вот права для пользователя на сервере.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853859
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все - я сдался. Не получилось никак. Возможно, кто-то сможет создать работающий прототип - было бы интересно увидеть пример приложения на каком-нибудь Гитхабе.

Реализовал через периодические async/await запросы за данными в таблице через, у которых ИД больше заданного. Количество данных в таблице меряется сотнями, так что не думаю чтоб оно сильно тупило.
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853868
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoРеализовал через периодические async/await запросы за данными в таблице через, у которых ИД больше заданного. Количество данных в таблице меряется сотнями, так что не думаю чтоб оно сильно тупило.Запрос чтения из очереди раз в полминуты от сотни операторов - это не слишком много...
Vadim Romanenkoalexeyvg,

Или не подошло, или этот SqlDependency вообще странно работает. Уже несколько раз перебрал и код, и документацию - единственное к чему можно прикопаться, это вот эти вот права для пользователя на сервере.Так для пользователя, которому явно дали такие права (не через паблик, а ему самому), работает?

Vadim RomanenkoВозможно, кто-то сможет создать работающий прототип - было бы интересно увидеть пример приложения на каком-нибудь Гитхабе.А пример кода от MS не подходит?
https://code.msdn.microsoft.com/How-to-use-SqlDependency-5c0da0b3
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853878
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

хотите некое альтернативное решение?

я правда не могу сказать как скажется такое решение на производительности сервера, это надо тестировать но руки не доходили.

данный подход основывается на функционале используемом в мониторах трасс и XE, а именно это процедура и функция:
Код: sql
1.
2.
sp_trace_getdata
fn_MSxe_read_event_stream



первая работает с серверными трассами, вторая с расширенными событиями, обе возвращают данные в виде потока.

также у нас есть средство позволяющее вызвать пользовательское событие:
Код: sql
1.
2.
3.
4.
5.
6.
7.
sp_trace_generateevent

[ @eventid=] event_id Is the ID of the event to turn on. event_id is int, with no default. The ID must be one of the event numbers from 82 through 91, which represent user-defined events as set with sp_trace_setevent.

[ @userinfo= ] 'user_info' Is the optional user-defined string identifying the reason for the event. user_info is nvarchar(128), with a default of NULL.

[ @userdata= ] user_data Is the optional user-specified data for the event. user_data is varbinary(8000), with a default of NULL.




итого все что требуется в приложении:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public static void Main(string[] args) {
    using (var cn = new SqlConnection("some_string")) {
       using (var cmd = new SqlCommand($"select [type], [data] from sys.fn_MSxe_read_event_stream('my_app', null);", cn) {
          try {
              cn.Open();
              var reader = cmd.ExecuteReader();
              while (reader.Read()) {
                  var somepayload = ParseData(reader.GetSqlBytes(1).ToSqlBinary().Value);
                  DoAction(somepayload);
              }
          }
          finnaly {}
       }
    }
 }

//остается только написать метод Parse которые будет парсить поток байт, там вполне все тривиально
//описание выходного потока для данных процедур можно найти в инете



на сервере:
Код: sql
1.
2.
3.
4.
5.
create event session [my_app2] on server
add event user_event (where event_id = 90 or event_id = 91) --соответственно никто не мешает расширить фильтр скажем на user_info
go
alter event session [my_app] on server state = start;
go



в таком случае сможете отсылать уведомления в приложение без особых заморочек с service broker
при этом у вас есть возможность логировать уведомления можно для расширенных событий настроить цель в файл к примеру.
и на декларативном уровне у вас появляется некоторая возможность конфигурирования уведомлений в user_info можно передавать nvarchar(128) а в data varbinary(8000), а то как вы уже будете использовать эту информацию зависит от вас.

Код: sql
1.
2.
  exec [sp_trace_generateevent] 90, N'some event 1', null
  exec [sp_trace_generateevent] 91, N'some event 2', null



при обращении к функции fn_MSxe_read_event_stream запрос подключается к сиквелу в режиме чтения с типом ожидания XE_LIVE_TARGET_TVF, тоже самое делает студия когды вы щелкаете "наблюдать за данными предаваемыми в режиме реального времени"
...
Рейтинг: 0 / 0
Уведомление клиентов об изменениях на сервере
    #39853926
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffитого все что требуется в приложенииТак этот вариант ТС упоминал: "постоянный опрос сервера с каждого клиента"
А он хочет заменить опросы на вызовы клиента со стороны сервера при наступлении некоего события (что в теории правильно, хотя есть вопрос, стоит ли это такого геморроя).
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уведомление клиентов об изменениях на сервере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]