powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / mon$attachments
24 сообщений из 24, страница 1 из 1
mon$attachments
    #40124738
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С Новым Годом!
Сегодня наконец внимательно прочитал мануал по сабжу и обнаружил, что обычные пользователи не могут читать инфу обо всех подключениях. А я на этом построил проверку для процедуры закрытия периода. Есть такая в приложении. При выполнении которой очень желательно, чтобы больше не было других подключений. Ну т.е. чтобы пользователь перед выполнением ее увидел предупреждение, что работают другие люди и соответственно чтобы он каким-либо образом попросил их выйти. Приложение и база небольшие, так что такая форма коммуникации вполне возможна. Разделение прав между пользователями присутствует. Есть несколько ролей, но админских прав нет ни у кого. Есть мысли как можно организовать такую проверку?
...
Рейтинг: 0 / 0
mon$attachments
    #40124739
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать табличку текущих коннектов.
В триггере на OnConnect заполняется, в триггере на OnDisconnect очищается.
А можно даже и не так - при коннекте запись вставляется, при дисконнекте записывается время дисконнекта.
Записи где времени дисконнекта нет - это текущие коннекты.
...
Рейтинг: 0 / 0
mon$attachments
    #40124740
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

Это понятно. Подобный вариант первый пришел на ум. Думалось может без своего велосипеда можно что-то сделать.
...
Рейтинг: 0 / 0
mon$attachments
    #40124754
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic
Сегодня наконец внимательно прочитал мануал по сабжу и обнаружил, что обычные пользователи не могут читать инфу обо всех подключениях. А я на этом построил проверку для процедуры закрытия периода. Есть такая в приложении. При выполнении которой очень желательно, чтобы больше не было других подключений
Начнём с начала - откуда такое требование и насколько оно критично ?
Я сильно сомневаюсь, что оно реально необходимо.

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

Какую таблицу резервировать - зависит от природы вышеуказанного требования.
Я подозреваю - что никакую :)
...
Рейтинг: 0 / 0
mon$attachments
    #40124764
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Требование возникло из того факта, что закрытие периода (месяца в нашем случае) подводит итог работы автотранспортного предприятия за этот период. Это значит, что все отчеты по основным показателям уже не могут меняться, в том числе и зарплата водителей, кстати. Поэтому прошлые периоды доступны только для просмотра. И если кто-то в момент или после закрытия все еще вводит или меняет документы из старого периода, а кто-то уже перешел на новый то возникнет неразбериха.

Насчет резервирования таблиц я тоже задумывался. Спасибо за совет, Влад. Но решил, что табличка подключений, которую присоветовал fraks в реализации попроще будет. Тем более, что если сделать структуру похожей на mon$attachments, то и менять нужно будет очень мало. В общем уже сделал.
...
Рейтинг: 0 / 0
mon$attachments
    #40124766
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvicИ если кто-то в момент или после закрытия все еще вводит или меняет документы из
старого периода, а кто-то уже перешел на новый то возникнет неразбериха.

И что вы со своей системой будете делать если кто-то не успел завести пару
документов закрытого периода? Дай угадаю: переоткрываете его?..

Лучше бы вам таки переделать дизайн пока не поздно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
mon$attachments
    #40124767
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic,

проверять наличие подключений это в корне не правильный путь. Ведь при выполнении процедуры закрытия периода важно чтоб никто не писал (добавлял/модифицировал/удалял документы), но это не обозначает что никто не может читать.

Про mon$attachments

1. в 4.0 таки можно читать инфу о других подключениях если чтение идёт в процедуре с SQL SECURITY DEFINER
2. в более младших версиях можно извратиться через EXECUTE STATEMENT ... AS USER SYSDBA или EXECUTE STATEMENT ... AS USER MON$ADM ... ROLE RDB$ADMIN
...
Рейтинг: 0 / 0
mon$attachments
    #40124769
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Таки да, переоткрываем. Но таких случаев за все время был один. Если бы не зарплата, то можно было бы подумать над изменением. А с зарплатой исключено. В день закрытия, это обычно число 5е-10е месяца, зарплата уже посчитана и выданы расчетные листки. Что-либо вводить или менять уже точно поздно.
...
Рейтинг: 0 / 0
mon$attachments
    #40124773
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic
Требование возникло из того факта, что закрытие периода (месяца в нашем случае) подводит итог работы автотранспортного предприятия за этот период. Это значит, что все отчеты по основным показателям уже не могут меняться, в том числе и зарплата водителей, кстати. Поэтому прошлые периоды доступны только для просмотра. И если кто-то в момент или после закрытия все еще вводит или меняет документы из старого периода, а кто-то уже перешел на новый то возникнет неразбериха.
Я не вижу тут требования выхода из программы. Есть требование не изменять состояние в закрытых и закрываемых периодах.
Т.е. достаточно иметь поле с состоянием периода (открыт, закрыт) и проверять его состояние перед внесением изменений. Думаю, это уже и так сделано.
Тогда, при закрытии периода, достаточно резервировать таблицу с периодами в режиме exclusive write.
Тут есть один недостаток - пока период закрывается, никто не сможет читать таблицу периодов.
Способ это обойти есть и я его покажу, если есть интерес.

Главная проблема с таблицей подключений - её нужно будет периодически проверять на наличие неудалённых (из-за сбоев) записей.
Тут уже обсуждали когда триггер на дисконнект не вызывается.
...
Рейтинг: 0 / 0
mon$attachments
    #40124774
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvicВ день закрытия, это обычно число 5е-10е месяца, зарплата уже посчитана и выданы
расчетные листки.

То есть, внезапно, можно ограничивать ввод не любых документов, а только
влияющих на зарплату и вместо "закрытого периода" можно использовать "наличие
расчётного листка". А чтобы не париться с конкурентным вводом - создавать его
черновик за пару дней до настоящего.

И таки опять же: что если кто-то реально забыл ввести такой документ, а листки
уже напечатаны и розданы? Что толку в закрытии/переоткрытии?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
mon$attachments
    #40124777
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

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

За советы спасибо. Насчет EXECUTE STATEMENT тоже подумывал, но решил, что реализовать свою attachments проще
...
Рейтинг: 0 / 0
mon$attachments
    #40124779
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Если кто-то ошибся с документами влияющими на зарплату, или сами данные пришли слишком поздно (больничные, разные справки), то все компенсируется в следующем месяце. Такой механизм существует везде, насколько я знаю.
...
Рейтинг: 0 / 0
mon$attachments
    #40124783
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvicто все компенсируется в следующем месяце

Воот. То есть твои закрытия периодов - не более чем известное детское желание
"чтобы слоники бегали". Софт должен облегчать своим пользователям работу, а не
создавать её.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
mon$attachments
    #40124793
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Я не вижу тут требования выхода из программы. Есть требование не изменять состояние в закрытых и закрываемых периодах.
Т.е. достаточно иметь поле с состоянием периода (открыт, закрыт) и проверять его состояние перед внесением изменений. Думаю, это уже и так сделано.
Тогда, при закрытии периода, достаточно резервировать таблицу с периодами в режиме exclusive write.
Тут есть один недостаток - пока период закрывается, никто не сможет читать таблицу периодов.
Способ это обойти есть и я его покажу, если есть интерес.

Главная проблема с таблицей подключений - её нужно будет периодически проверять на наличие неудалённых (из-за сбоев) записей.
Тут уже обсуждали когда триггер на дисконнект не вызывается.

Сразу не увидел твой пост.
Да все так.
Ответил уже Симонову Денису. Его замечание было практически аналогично твоему.

Состояние периода (открыт/закрыт) реализовано несколько иначе. Есть таблица итогов, а не периодов. Записи там появляются как раз в момент закрытия. Соответственно незакрытым считается период , следующий за последним в этой таблице. Он же текущий если пользователь не переключился на более ранний. Переключиться кстати могут не все. Если пользователь переключился на более ранний, то текущий и незакрытый периоды не совпадают, и в этом случае изменения запрещены.

Насчет сбоев спасибо. Реализую наверно в кроне удаление зависших записей.
...
Рейтинг: 0 / 0
mon$attachments
    #40124801
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы развеять мнение насчет неудобств пользователям, создаваемым требованием выхода на момент закрытия.
Такая схема работает уже очень давно. Лет двадцать, не меньше. Само приложение я перевел недавно на firebird с другим гуем. До того было сделано на древнем парадоксе. Менять всю схему приложения даже мыслей не было. Потому что в одиночку (а больше некому) чересчур сложно, да и пользователи нифига не оценят, скорее наоборот. Сама проблема коннектов и предупреждения возникла в этом году. Приложением захотела попользоваться еще одна автобаза. Наши и так административными мерами запрещали вход в программу пока идет сверка всех отчетов перед закрытием. Саму сверку проводят один, два человека. Ну а само закрытие естественно один. А вот у соседей замечал, что в момент закрытия не все пользователи выходят. Вот и решил подстраховаться чтобы не было возможности сделать критическую ошибку.
...
Рейтинг: 0 / 0
mon$attachments
    #40124808
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, ну да, привычный геморрой за геморрой не считается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
mon$attachments
    #40124810
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ну да, ну да, привычный геморрой за геморрой не считается.
Не всякий геморрой нужно лечить нанотехнологиями :)
Рекомендации озвучены, плюсы и минусы рассмотрены - дальше выбирает тот, кто делает и потом сопровождает, а не тот, кто ищет развлечение.
...
Рейтинг: 0 / 0
mon$attachments
    #40124939
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поразмыслив решил таки, что своя attachments с триггерами и постоянной проверкой, что какое-то подключение может сбойнуть и не удалить себя слишком геморно и не надежно. Решил использовать execute statement ... as user ... . Но получилось сделать только с SYSDBA. А других пользователей firebird кроме SYSDBA у меня нет. Используется trusted authentication. Не очень хочется светить пароль sysdba. Свою учетку я примапил во всех базах к роли RDB$ADMIN. Вопрос - можно как-то ее использовать?
...
Рейтинг: 0 / 0
mon$attachments
    #40124948
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic
Используется trusted authentication. Не очень хочется светить пароль sysdba
Если "светить" - это использовать литерал в тексте процедуры, то пароль можно положить в таблицу и брать из неё.
Либо передавать его из приложения через пар-р процедуры.

stelvic
Свою учетку я примапил во всех базах к роли RDB$ADMIN. Вопрос - можно как-то ее использовать?
См (2) в 22417373
...
Рейтинг: 0 / 0
mon$attachments
    #40124960
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
См (2) в 22417373


Что-то не могу никак сообразить. С сисдба получилось сразу:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
execute block
returns (id bigint, usr varchar(31))
as begin
    for execute statement 'select mon$attachment_id, mon$user from mon$attachments order by mon$timestamp'
    as user 'sysdba' password 'dbapass'
    --as user 'DOMEN\USER' role 'RDB$ADMIN'
    into id, usr do suspend;
end


В варианте с доменной учеткой всегда посылает к администратору за логином фаерберда.
Или имелось в виду завести пользователя фаерберд для этого случая?
...
Рейтинг: 0 / 0
mon$attachments
    #40124968
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic,

если ты указал 'AS USER', то никакой trusted auth уже не будет.
Firebird будет пытаться искать указанного юзера в своей security.db.

Если же AS USER не указывать, то для локального коннекта (как в твоём примере) будет embedded доступ с SQL-аккаунтом текущего SQL юзера.
Для сетевого коннекта без указания AS USER будет пробоваться trusted auth с аккаунтом OS, под которым работает процесс Firebrid
...
Рейтинг: 0 / 0
mon$attachments
    #40124971
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Я совсем запутался. Я думал, что если не указывать as user, то будет current_user.

Локального коннекта быть не может. Сервер и база находятся на другом компе. Примеры выполнял в ibexperte. Соединение указывал remote tcp/ip, ip-адрес сервера, алиас базы.

Попробовал убрать as user оставил role 'rdb$admin'. На роль никак не отреагировал. Просто выдал все коннекты текущего пользователя как если ввести простой 'select * from mon$attachments'. Только без звездочки, а с полями из примера.
...
Рейтинг: 0 / 0
mon$attachments
    #40124973
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stelvic
Я совсем запутался. Я думал, что если не указывать as user, то будет current_user.
hvlad
Если же AS USER не указывать, то для локального коннекта (как в твоём примере) будет embedded доступ с SQL-аккаунтом текущего SQL юзера.
Всё ещё путаешься ?

Тут вроде подробно расписаны все варианты
https://www.firebirdsql.org/file/documentation/html/en/refdocs/fblangref30/firebird-30-language-reference.html#fblangref30-psql-execstmt-onexternal


stelvic
Локального коннекта быть не может.
Ну так в примере-то он локальный, я и рассказал про локальный.

stelvic
Попробовал убрать as user оставил role 'rdb$admin'. На роль никак не отреагировал.
И не должен был реагировать.
...
Рейтинг: 0 / 0
mon$attachments
    #40124993
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Так ты on external имел в виду? Ну что ж. Спасибо за терпение. :)
Такой вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
execute block
returns (id bigint, usr varchar(31), rl varchar(31))
as begin
    for execute statement 'select mon$attachment_id, mon$user, mon$role from mon$attachments'
    on external '192.168.101.25:test'
    into id, usr, rl do suspend;
end


сработал. Правда вначале тоже выдал только одну запись с юзером с именем сервака в домене. Но после того как подмапил ему роль rdb$admin уже получил все. Плюс еще одну правда, но это уже мелочь. Еще подумалось, что это нехилая такая дыра в безопасности получается.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / mon$attachments
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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