Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Сканирование подключений к базе firebird


Автор: Cinemaizer[Олег] 7.9.2011, 15:55
Располагаем D7, firebird 2.5, fibplus. Задача - раз в секунду сканить текущие подключения (имя юзера и айпишник) к базе.
Простой код с участием фиб-запроса (на таймере) выдает лишь одно подключение - то с которым я авторизовался при запуске приложение и подключился к базе. Хотя тот же самый запрос если использовать в ibexpert, там все корректно - кажет и свое подключение и мои - из приложений. Вопрос - что у меня не так?

Код

procedure TfrmMAIN.Timer2Timer(Sender: TObject);
var
  ListItem: TListItem;
begin
  with DM.ReadQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Text:='select MON$USER, MON$REMOTE_ADDRESS from mon$attachments';
    ExecQuery;
    sListView1.Items.Clear;
    while not Eof do
    begin
      ListItem:=sListView1.Items.Add;
      ListItem.Caption:=Fields[0].AsString;
      ListItem.SubItems.Add(Fields[1].AsString);
      Next;
    end;
  end;
end;


Использовал разные типы запросов - и простые (всегда открытые на чтение) и другие (с авто-стартом и автокомитом). GotoFirstRecordOnExecute = True, естественно.
В общем, запросы на чтение возвращают лишь одну запись, запросы с авто-стартом и автокомитом вообще ничего не возвращали.

Автор: AndreyIQ 7.9.2011, 16:27
Цитата(Cinemaizer[Олег)
,7.9.2011,  15:55]Располагаем D7, firebird 2.5, fibplus. Задача - раз в секунду сканить текущие подключения (имя юзера и айпишник) к базе.
Простой код с участием фиб-запроса (на таймере) выдает лишь одно подключение - то с которым я авторизовался при запуске приложение и подключился к базе. Хотя тот же самый запрос если использовать в ibexpert, там все корректно - кажет и свое подключение и мои - из приложений. Вопрос - что у меня не так?

Код

procedure TfrmMAIN.Timer2Timer(Sender: TObject);
var
  ListItem: TListItem;
begin
  with DM.ReadQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Text:='select MON$USER, MON$REMOTE_ADDRESS from mon$attachments';
    ExecQuery;
    sListView1.Items.Clear;
    while not Eof do
    begin
      ListItem:=sListView1.Items.Add;
      ListItem.Caption:=Fields[0].AsString;
      ListItem.SubItems.Add(Fields[1].AsString);
      Next;
    end;
  end;
end;


Использовал разные типы запросов - и простые (всегда открытые на чтение) и другие (с авто-стартом и автокомитом). GotoFirstRecordOnExecute = True, естественно.
В общем, запросы на чтение возвращают лишь одну запись, запросы с авто-стартом и автокомитом вообще ничего не возвращали.

На Delphi 2009, firebird 2.5 через обычный IBQuery, без проблем выдает все подключения.
Может надо заменить ExecQuery на Open

Автор: Cinemaizer[Олег] 7.9.2011, 16:45
Open в данном случае не метод, а ридонли-свойство, так что не пойдет.

Добавлено @ 16:57
Упс... Залогинился в ibexperte под простым юзером (не SYSDBA), теперь тоже только одно подключение вижу, хотя их два на сей момент. А вот если в приложении логинюсь под SYSDBA то все подключения вижу. Хм... и как быть?
Получается, что токмо Богу (SYSDBA) сверху всех видно, а простым священнослужителям-шаманам-админам, не?  smile 

Автор: Cinemaizer[Олег] 7.9.2011, 17:15
И кстати, архитектура сервера у меня: SuperServer.

Автор: Cinemaizer[Олег] 8.9.2011, 20:33
Цитата(Cinemaizer[Олег)
, 7.9.2011,  14:45, post2398947]Залогинился в ibexperte под простым юзером (не SYSDBA), теперь тоже только одно подключение вижу, хотя их два на сей момент. А вот если в приложении логинюсь под SYSDBA то все подключения вижу. Хм... и как быть?
Получается, что токмо Богу (SYSDBA) сверху всех видно, а простым священнослужителям-шаманам-админам, не?   

Неужели никто не знает точный ответ?

Автор: AndreyIQ 9.9.2011, 08:36
Цитата(Cinemaizer[Олег)
,8.9.2011,  20:33]
Цитата(Cinemaizer[Олег)
, 7.9.2011,  14:45, post2398947]Залогинился в ibexperte под простым юзером (не SYSDBA), теперь тоже только одно подключение вижу, хотя их два на сей момент. А вот если в приложении логинюсь под SYSDBA то все подключения вижу. Хм... и как быть?
Получается, что токмо Богу (SYSDBA) сверху всех видно, а простым священнослужителям-шаманам-админам, не?   

Неужели никто не знает точный ответ?

Первое, что пришло в голову, поставить триггер на connect и diconnect. Примерно так:
Код

CREATE TABLE CONNECTIONS (
    USER_NAME  CHAR(100),
    ADDRESS    CHAR(100),
    ID         INTEGER
);
.....
CREATE OR ALTER TRIGGER t_connect
ACTIVE ON CONNECT POSITION 0
as
 BEGIN
 insert into connections
 select MON$USER, MON$REMOTE_ADDRESS, MON$ATTACHMENT_ID from MON$ATTACHMENTS where MON$ATTACHMENT_ID = CURRENT_CONNECTION;
 END
.......
CREATE OR ALTER TRIGGER t_disconnect
ACTIVE ON DISCONNECT POSITION 0
as
 BEGIN
 delete from connections where ID = CURRENT_CONNECTION;
 END

Автор: Cinemaizer[Олег] 9.9.2011, 09:33
О! Точно. Спасибо! Хорошая идея...

Автор: Akella 9.9.2011, 12:30
Цитата(Cinemaizer[Олег)
,8.9.2011,  20:33]
Цитата(Cinemaizer[Олег)
, 7.9.2011,  14:45, post2398947]Залогинился в ibexperte под простым юзером (не SYSDBA), теперь тоже только одно подключение вижу, хотя их два на сей момент. А вот если в приложении логинюсь под SYSDBA то все подключения вижу. Хм... и как быть?
Получается, что токмо Богу (SYSDBA) сверху всех видно, а простым священнослужителям-шаманам-админам, не?   

Неужели никто не знает точный ответ?

читай доки smile
Юзер видит только свои подключения. SYSDBA все.

Добавлено через 1 минуту и 47 секунд
Цитата(Cinemaizer[Олег)
, 7.9.2011,  15:55, post2398921]раз в секунду сканить текущие подключения

Не часто ли?

Автор: Cinemaizer[Олег] 9.9.2011, 14:51
Цитата(Akella @  9.9.2011,  10:30 Найти цитируемый пост)
Не часто ли? 


А чего, сильно часто на твой взгляд?  smile 

Автор: Akella 9.9.2011, 19:47
а какой смысл так часто?

Автор: Cinemaizer[Олег] 9.9.2011, 20:16
да фз smile можно и 5 сек поставить в принципе smile 
ЗЫ:
У меня снова проблема с восприятием баланса ОПТИМАЛЬНАЯ производительность<->требования? smile
(вообще это не сарказм, я серьезен вполне)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)