Как отследить сервис firebird - PullRequest
1 голос
/ 17 апреля 2020

Как отследить все события для сервиса firebird server с delphi xe10? Это мой код:

my := TIBControlService.Create(Self);

my.ServerName := '127.0.0.1/3050';
my.Protocol := TProtocol.TCP;

my.LoginPrompt := false;
my.TraceFlags := [tfQPrepare, tfQExecute, tfQFetch, tfError, tfStmt, tfConnect, tfTransact, tfBlob, tfService, tfMisc];

my.Params.Add( 'user_name=SYSDBA' );
my.Params.Add( 'password=masterkey' );

// -----
mh := MonitorHook;
mh.TraceFlags := my.TraceFlags;

Self.IBSQLMonitor1.TraceFlags := my.TraceFlags;
mh.RegisterMonitor(Self.IBSQLMonitor1);

Self.IBSQLMonitor1.Enabled := true;
Memo1.Lines.Add( Format('GetMonitorCount: %d',[mh.GetMonitorCount]) );


my.Attach;

Memo1.Lines.Add( Format('Active: %s',[System.StrUtils.IfThen(my.Active,'yes','no')]) );

и

procedure TForm1.IBSQLMonitor1SQL(EventText: string; EventTime: TDateTime);
begin
    Memo1.Lines.Add(EventText);
end;

Результат:

GetMonitorCount: 1
Active: yes

[Application:]
:[Attach]

[Application:]
:[Query]

Но этот результат только из моего приложения. Когда я подключаюсь из другого процесса (например, sql), мое приложение не показывает это событие.

1 Ответ

1 голос
/ 17 апреля 2020
  1. Говоря о Interbase / Firebird, термин EVENT имеет очень специфическое значение c, конкретную команду c SQL, которая отправляет текстовые константы клиентам, которые подписаны на них.

    См. http://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25 - psql -postevent

    Однако клиент должен подписаться на точно такую ​​же текстовую строку, как отправлено PSQL блок. Были разговоры о включении подписки на основе масок, которая потенциально позволила бы подписаться на все SQL события, например, *.* соответствует всем файлам в Windows, но, насколько мне известно, они никогда не материализовались.

    Это то, что означает «событие» в Firebird, но, похоже, это не то, что вы имеете в виду, вместо этого вам кажется, что вы хотите отслеживать все виды активности, протекающей между сервером SQL и всеми приложениями, начиная с SQL командами и т. д.

    Если это так, то в общем случае сделать это невозможно. Вы должны решить, что именно и почему именно вы хотите, и, возможно, будут некоторые частичные решения.

  2. В Firebird 2.5 введена так называемая трассировка API , который позволяет подписаться на НЕКОТОРЫЕ действия и получать уведомления о них. Это, как правило, создает значительную нагрузку на движок, в зависимости от того, насколько расплывчаты ваши фильтры подписки и сколько запросов получает сервер - это может увеличить использование ОЗУ и ЦП до полной неработоспособности.

    • Виды деятельности, на которые можно подписаться, ограничены. Например, процесс чтения больших двоичных объектов не отслеживается. Когда я спросил - я боролся с печально известным «Неверным идентификатором BLOB», который был вызван Delphi db Express причудой библиотеки - мне сказали, что «никто никогда не нуждался в этом, и у вас мало Причины этого тоже нужны. Вы сделали демо-проект, прислали его нам - и мы объяснили вам поведение ». То время, когда отслеживание доступа к BLOB-объектам мне очень помогло, но, если быть объективным, это был единственный и единственный случай, когда я действительно нуждался в этом.

    • Вы могли бы взглянуть на то, что можете получить в целом Firebird Trace Manager - утилиту CLI, которая является частью дистрибутива FB, начиная с 2.5.

    • Вы можете взглянуть на Firebird Profiler , бесплатный упрощенный инструмент c GUI из http://fbprofiler.sf.net

    • Коммерческие интегрированные среды разработки БД для Firebird, такие как IBExpert или UpScene TraceManager и, возможно, другие также обычно имеют поддержку Trace API.

    • Вы можете реализовать свою собственную реализацию, используя Trace API, начиная с Program Files\Firebird\Firebird_2_5\doc\README.trace_services.txt и Program Files\Firebird\Firebird_2_5\include\ibase.h. Также может случиться, что сторонние библиотеки, такие как Unified Interbase или IBObjects , перевели API на Delphi. Я думаю, что видел что-то о трассировке в UIB , но я не уверен. Я не ожидал бы, что такая библиотека будет частью Delphi дистрибутива: с Delphi точка зрения Firebird является прямым конкурентом их Interbase Библиотеки и IBX вряд ли будут заинтересованы в том, чтобы отличаться от собственной Interbase , поддерживая только функции Firebird .

  3. При условии, что вы заботитесь только о нативных приложениях, таких как Delphi, вы можете решить создать свой собственный interposer fbclient.dll и установить его на все клиентские компьютеры вместо стандартных DLL. То же самое для устаревшей эмуляции GDS32.DLL , если используется вашими приложениями.

    • Эта DLL должна полностью обеспечивать все вызовы API, оба класса c, описанные в документации IB6 на http://firebirdsql.org/en/reference-manuals/ со всеми обновлениями после IB6 и новым Firebird 3 «объектно-ориентированным API».
    • Он должен регистрировать вызовы любым способом, а затем должен прокси вызов для копии оригинальной клиентской DLL, которую вы будете скрывать для нее с другим именем файла. Он должен быть установлен вместо стандартной клиентской DLL на каждом компьютере, который вы хотите перехватить и контролировать.
    • Это не должно быть очень сложно с classi c API, люди делали это, хотя и не публиковали sh. Но новый ooAPI может быть сложным.
    • Он будет перехватывать только приложения, работающие через интерфейс fbclient.DLL . Приложения Java, использующие Jaybird и C# приложения, использующие библиотеки . Net , вероятно, будут использовать базовый проводной протокол , пропуская fbclient.dll и, следовательно, ваш вставщик тоже.
...