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

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

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

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

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

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

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

1. Можно брокером воспользоваться, Нотификациями
2. Можно из триггеров кидать в брокерскую очередь записи, а тот, кто обрабатывает очередь будет рассылать, например, через какой-то существующий механизм обработки сообщений.
3. Можно периодически запрашивать с клиентов
...
...
Рейтинг: 0 / 0
12.01.2017, 17:14
    #39383392
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оповещение приложений при изменении данных в таблице MSSQL
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
12.01.2017, 17:24
    #39383401
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оповещение приложений при изменении данных в таблице MSSQL
Код: 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
13.01.2017, 09:24
    #39383774
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оповещение приложений при изменении данных в таблице MSSQL
Arm79,
Спасибо, заработало с EXTERNAL_ACCESS.
...
Рейтинг: 0 / 0
13.01.2017, 12:47
    #39384035
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оповещение приложений при изменении данных в таблице MSSQL
Kolu4kaArm79,
Спасибо, заработало с EXTERNAL_ACCESS.

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


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