Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Снова триггеры в firebird / 25 сообщений из 48, страница 1 из 2
17.10.2016, 14:43
    #39328228
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Здравствуйте уважаемые форумчане. Прошу Вашей помощи.
Имеется сервер firebird полторашка и IBExpert на сервере и клиентские приложения, которые работают уже более 10 лет. Возникла необходимость в написании доп. ПО. которое ловит событие добавления строки в таблицу и с этой инфой делает определенные действия. Клиент работает на C#.

В IBexpert создается триггер, вот его код:

Код: sql
1.
2.
3.
4.
5.
6.
CREATE OR ALTER TRIGGER VISIT_EVENT FOR VISITS
ACTIVE AFTER INSERT POSITION 0
AS
begin
  POST_EVENT 'new_visit';
end



Суть триггера проста до безобразия, после добавления строки все подписанные клиенты получают уведомление.
На всякий случай кусок кода C#, который подписывается на это событие

Код: 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.
class Program
    {
        static void Main(string[] args)
        {

            FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
            cs.DataSource = "тут адрес сервера";
            cs.Database = "тут база";
            cs.UserID = "SYSDBA";
            cs.Password = "тут пароль";
            cs.Charset = "NONE";
            cs.Pooling = false;
            FbConnection connection = new FbConnection(cs.ToString());
            connection.Open();

            FbRemoteEvent revent = new FbRemoteEvent(connection);
            revent.AddEvents(new string[] { "new_visit","NEW_EVENT","EDIT_GATEKEY" });
            //Добавить функцию обратного вызова для Firebird событий
            revent.RemoteEventCounts += new FbRemoteEventEventHandler(EventCounts);
            revent.QueueEvents();
            Console.ReadLine();
            connection.Close();           
        }

        static void EventCounts(object sender, FbRemoteEventEventArgs args)
        {
            Console.WriteLine("Event {0} has {1} counts.", args.Name, args.Counts);
        }
    }



Собственно в чем проблема:
1. Кода клиентское приложение вставляет строку в таблицу событие не срабатывает
2. Когда я добавляю строку в эту таблицу с помощью IBExpert, и делаю подтверждение транзакции, клиентское приложение, код которого описан выше прекрасно перехватывает событие и выводит информацию об этом на консоль. Два дня маюсь, весь гугл прогуглил и ничего не нашел. Может кто поможет, с меня пиво
...
Рейтинг: 0 / 0
17.10.2016, 14:49
    #39328237
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Hello, Kadet635!
You wrote on 17 октября 2016 г. 14:49:08:

Kadet635> после добавления строки все подписанные клиенты получают уведомление.нет.
они его получат при коммите.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 14:55
    #39328246
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Мимопроходящий, простите, может я чего то не понимаю, но разве без коммита можно сохранить данные в таблице?

Может тогда кто то подскажет как решить проблему? Приложение которое добавляет строки в эту табл. написано давно и исходников у меня нет
...
Рейтинг: 0 / 0
17.10.2016, 14:59
    #39328250
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
понятия не имею когда твой шарп соизволит коммитить данные.
...
Рейтинг: 0 / 0
17.10.2016, 15:00
    #39328251
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Мимопроходящий, я тебя услышал
...
Рейтинг: 0 / 0
17.10.2016, 15:00
    #39328253
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Есть у кого то еще мысли?
...
Рейтинг: 0 / 0
17.10.2016, 15:04
    #39328260
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635,

как по твоему событие может быть поймано, если подключение для ловли этого события уже закрыто?
...
Рейтинг: 0 / 0
17.10.2016, 15:05
    #39328262
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635,

какие еще мысли. события рассылаются по коммиту той транзакции, где эти события произошли. аминь. До коммита никакие события из этой транзакции никому отправлены не будут.
...
Рейтинг: 0 / 0
17.10.2016, 15:10
    #39328271
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Симонов Денис,Почему ты решил, что оно закрыто????

Код: c#
1.
Console.ReadLine();



этот оператор блокирует закрытие подключения
...
Рейтинг: 0 / 0
17.10.2016, 15:26
    #39328295
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Вопрос к знатокам, если делать триггер before, а не after транзакция тоже нужна?
...
Рейтинг: 0 / 0
17.10.2016, 15:30
    #39328299
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Hello, Kadet635!
You wrote on 17 октября 2016 г. 15:28:57:

Kadet635> Вопрос к знатокам, если делать триггер before, а не after транзакция тоже нужна?
я тыбе адын умный весч скажу, толька ты ни абыжайса (с)

вне транзакции триггеры не работают ни в одной СУБД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 15:30
    #39328300
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635Вопрос к знатокам, если делать триггер before, а не after транзакция тоже нужна?
не то чтобы нужна, но без нее просто невозможно физически
...
Рейтинг: 0 / 0
17.10.2016, 15:43
    #39328317
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635Кода клиентское приложение вставляет строку в таблицу событие не срабатывает
значит, приложение делает коммит где-то после, например "после вставки всех нужных строк в таблицу".
Events, собственно, индицируют что действие произошло и сохранено по commit. Если транзакция завершилась по rollback, никакие события из этой транзакции никому не отправляются. А тип триггера, как уже сказали, никакого значения не имеет.
...
Рейтинг: 0 / 0
17.10.2016, 15:44
    #39328320
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635,

берёшь трейс и смотришь когда твоё приложение стартует и завершает транзакцию. Подозреваю, что автокоммит в ADO.NET сделан через COMMIT RETAIN, что может приводить к таким приколам.

Кстати в твоём примере для воспроизведения что-то не видно метода который вставляет строку в таблицу.
...
Рейтинг: 0 / 0
17.10.2016, 15:49
    #39328324
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Симонов Денис, Все верно этой строки там нет. Это приложение только хочет отловить событие. А приложение которое занимается добавлением данных в эту таблицу скомпилировано в exe и исходников у меня нет, я не знаю логики его работы, но оно добавляет строки в эту таблицу и моя задача получать оповещение всякий раз, когда оно это делает
...
Рейтинг: 0 / 0
17.10.2016, 15:53
    #39328331
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635,

трейсом смотри что это приложение делает.
...
Рейтинг: 0 / 0
17.10.2016, 16:00
    #39328342
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Симонов Денис, ты имеешь в виду снифером смотреть что отправляет приложение? или я чего то не понимаю? направь на путь истинный)
...
Рейтинг: 0 / 0
17.10.2016, 16:06
    #39328349
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635> Есть у кого то еще мысли?

Есть.

1. Какая версия FB?
2. Для чего сабдж нужен.

Если для чего-то полезного - ну есть способ, я как-то
его уже подсказывал, но не всем его можно вручить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 16:06
    #39328351
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
...
Рейтинг: 0 / 0
17.10.2016, 16:08
    #39328356
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Симонов Денис, Спасибо)
...
Рейтинг: 0 / 0
17.10.2016, 16:13
    #39328365
kadet635
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Гаджимурадов Рустам, версия 1,5.
Для того чтоб поймать событие добавления строки в таблицу посещения, затем смотрю добавленную строку, вытаскиваю номер карты и средствами SerialPort записываю ключ в контроллеры СКУДа.

Можно конечно постоянно опрашивать таблицу, но это идиотизм
...
Рейтинг: 0 / 0
17.10.2016, 16:23
    #39328372
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
добавь в таблицу поле.
навесь на него генератор (в триггере).
запоминай "предыдущее" значение генератора и тащи к себе всё что "новее".

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 16:35
    #39328378
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Мимопроходящий,

Эээ. Может, не надо?
Пусть уж лучше сразу номера вставленных карт в новую таблицу - журнал пишет. И оттуда обработанные грохает.
...
Рейтинг: 0 / 0
17.10.2016, 16:40
    #39328383
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
Hello, Wildsery!
You wrote on 17 октября 2016 г. 16:40:03:

Wildsery> Пусть уж лучше сразу номера вставленных карт в новую таблицу - журнал пишет.
> И оттуда обработанные грохает.не знаю как пацаны, но я лично не возражаю... (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 16:43
    #39328384
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снова триггеры в firebird
kadet635> записываю ключ в контроллеры СКУДа.

Хорошо, что я уточнил.
Вот в таком случае нельзя
гранату в руки давать. :)

> Можно конечно постоянно опрашивать таблицу, но это идиотизм

Ну смотря что и как реализовывать и какая периодичность нужна.
Про генераторы уже подсказали, про отдельную таблицу-журнал
тоже сказали (грохать из неё необязательно, кстати). Есть ещё
внешние таблицы и ещё пара вариантов. Выбирай на любой вкус.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Снова триггеры в firebird / 25 сообщений из 48, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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