powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Оповещение приложений при изменении данных в таблице MSSQL
16 сообщений из 16, страница 1 из 1
Оповещение приложений при изменении данных в таблице MSSQL
    #39372377
asp041262
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приложение написанное на C# изменяет данные в таблице СУБД MSSQL. После изменения нужно оповестить приложения на других компьютерах в сети об изменении в таблице для обновления данных. Ума не приложу где копать.
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372382
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
asp041262Ума не приложу где копать.
Копать в сторону периодического опроса базы насчет изменений
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372385
asp041262
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это проще простого. У пользователя есть кнопочка для обновления данных. Давным давно читал о создании объекта событие в СУБД и подключении к нему из приложения.
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372388
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2asp041262Ума не приложу где копать.
Копать в сторону периодического опроса базы насчет изменений
отстал от жизни ))

Query Notifications
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372560
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2, Изопропил,
А имеет ли право на жизнь такая реализация - в таблице есть триггер, который при обновлении отправляет по udp на подключенных клиентов id обновленных записей, клиент их получив делает выборку только этих записей.
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372761
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4kaCat2, Изопропил,
А имеет ли право на жизнь такая реализация - в таблице есть триггер, который при обновлении отправляет по udp на подключенных клиентов id обновленных записей, клиент их получив делает выборку только этих записей.
Имеет. Только UPD не гарантирует доставку сообщений. Кроме того, такой триггер должен вызывать CLR процедуру, которой нужно дать более расширенные права.

Так что я бы все-таки остановился либо на нотификациях, либо (если по ограничениям нотификация не проходит) периодический опрос по полю с типом ROWVERSION.

Если потребителей информации много, то чтобы не нагружать БД я бы сделал отдельный сервис, опрашивающий данные и рассылающий изменения подключенным к нему клиентам.
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372895
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4kaCat2, Изопропил,
А имеет ли право на жизнь такая реализация - в таблице есть триггер, который при обновлении отправляет по udp на подключенных клиентов id обновленных записей, клиент их получив делает выборку только этих записей.
для этого есть SQL Server Service Broker (вроде как)
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372925
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesдля этого есть SQL Server Service Broker (вроде как)
почему вроде? в документации ясно написано
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39372962
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилRoman Mejtesдля этого есть SQL Server Service Broker (вроде как)
почему вроде? в документации ясно написано
вроде потому, что я только читал про это, сам не использовал :)
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39373022
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Спасибо. С брокером что-то не получилось разобраться :-(
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39373207
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИзопропилCat2пропущено...

Копать в сторону периодического опроса базы насчет изменений
отстал от жизни ))

Query Notifications
Вот если бы ТС начал копать отсюда, до сам бы до Query Notifications докопался!
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39378423
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4kaArm79,
Спасибо. С брокером что-то не получилось разобраться :-(

Надо себя заставлять.

1. Можно брокером воспользоваться, Нотификациями
2. Можно из триггеров кидать в брокерскую очередь записи, а тот, кто обрабатывает очередь будет рассылать, например, через какой-то существующий механизм обработки сообщений.
3. Можно периодически запрашивать с клиентов
...
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39383392
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Кроме того, такой триггер должен вызывать CLR процедуру, которой нужно дать более расширенные права.
А Вы не подскажите, как дать расширенные права?
Триггер такой, не работает, из-за ограничения прав
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
[Microsoft.SqlServer.Server.SqlTrigger(Name = "trgclr_update", Target = "table", Event = "AFTER UPDATE")]
    public static void trgclr_update()
    {
        string cmd = "UPD";
        StringBuilder sb = new StringBuilder();
        SqlDataReader reader;
        SqlCommand command;
        DataTable dt = new DataTable();

        if (SqlContext.TriggerContext.TriggerAction == TriggerAction.Update)
        {
            using (SqlConnection conn = new SqlConnection("context connection=true"))
            {
                conn.Open();
                //набор записей обработанных в тригере
                command = new SqlCommand("select RowId from inserted", conn);
                reader = command.ExecuteReader();
                dt.Load(reader);
                reader.Close();
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                        sb.Append("<Id>" + dr["RowId"].ToString() + "</Id>");

                    //подключенные клиенты
                    command = new SqlCommand(@"SELECT distinct CASE WHEN dmec.client_net_address='<local machine>' Then '127.0.0.1' Else dmec.client_net_address End IPadr
                                                                        FROM sys.sysprocesses sp 
                                                                        INNER JOIN sys.dm_exec_connections dmec ON sp.spid = dmec.session_id
                                                                        WHERE sp.dbid=DB_ID(N'test')", conn);
                    reader = command.ExecuteReader();
                    dt = new DataTable();
                    dt.Load(reader);
                    reader.Close();
                    //отправка сообщений
                    foreach (DataRow dr in dt.Rows)
                        SendMsg(dr["IPadr"].ToString(), string.Format("<{0}>{1}</{0}>", cmd, sb.ToString()));
                }

            }
        }
    }

    private static void SendMsg(string adr, string Msg)
    {
        UdpClient sender = new UdpClient();
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(adr), 49500);

        byte[] bytes = Encoding.UTF8.GetBytes(Msg.ToString());
        try
        {
            sender.Send(bytes, bytes.Length, endPoint);
        }
        finally
        {
            sender.Close();
        }
    }


Или в этом случае права должны быть у пользователя который делает апдейт?
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39383401
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE ASSEMBLY assembly_name  
[ AUTHORIZATION owner_name ]  
FROM { <client_assembly_specifier> | <assembly_bits> [ ,...n ] }  
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]  
[ ; ]  
<client_assembly_specifier> :: =  
        '[\\computer_name\]share_name\[path\]manifest_file_name'  
  | '[local_path\]manifest_file_name'  
  
<assembly_bits> :: =  
{ varbinary_literal | varbinary_expression }  


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

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


UNSAFE предоставляет сборкам неограниченный доступ к ресурсам как внутри, так и вне экземпляра SQL Server. Код, исполняемый из сборки с набором прав UNSAFE, может вызывать неуправляемый код.
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39383774
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Спасибо, заработало с EXTERNAL_ACCESS.
...
Рейтинг: 0 / 0
Оповещение приложений при изменении данных в таблице MSSQL
    #39384035
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4kaArm79,
Спасибо, заработало с EXTERNAL_ACCESS.

Только надо помнить, что , если, предположим, ваша база будет размещена на сервере в туче (типа Амазона, Азуре и т.д.), там этот фокус не пройдёт.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Оповещение приложений при изменении данных в таблице MSSQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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