|
mon$attachments
|
|||
---|---|---|---|
#18+
С Новым Годом! Сегодня наконец внимательно прочитал мануал по сабжу и обнаружил, что обычные пользователи не могут читать инфу обо всех подключениях. А я на этом построил проверку для процедуры закрытия периода. Есть такая в приложении. При выполнении которой очень желательно, чтобы больше не было других подключений. Ну т.е. чтобы пользователь перед выполнением ее увидел предупреждение, что работают другие люди и соответственно чтобы он каким-либо образом попросил их выйти. Приложение и база небольшие, так что такая форма коммуникации вполне возможна. Разделение прав между пользователями присутствует. Есть несколько ролей, но админских прав нет ни у кого. Есть мысли как можно организовать такую проверку? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 08:32 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Сделать табличку текущих коннектов. В триггере на OnConnect заполняется, в триггере на OnDisconnect очищается. А можно даже и не так - при коннекте запись вставляется, при дисконнекте записывается время дисконнекта. Записи где времени дисконнекта нет - это текущие коннекты. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 09:15 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
fraks, Это понятно. Подобный вариант первый пришел на ум. Думалось может без своего велосипеда можно что-то сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 10:00 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvic Сегодня наконец внимательно прочитал мануал по сабжу и обнаружил, что обычные пользователи не могут читать инфу обо всех подключениях. А я на этом построил проверку для процедуры закрытия периода. Есть такая в приложении. При выполнении которой очень желательно, чтобы больше не было других подключений Я сильно сомневаюсь, что оно реально необходимо. Но, если без него уж совсем никак, то можно попробовать задействовать явное резервирование какой-либо "основной" таблицы. Т.е. пробовать стартовать тр-цию с явным резервированием и с таймаутом до тех пор, пока не получится. В цикле рассылать просьбы, мольбы и угрозы о выходе из приложения. Когда процесс начнётся и таблица будет зарезервирована, другие коннекты (тр-ции) не смогут её использовать (зависит от уровня резервирования) и будут ждать окончания процесса или получать ошибки по истечению таймаута своих тр-ций. Какую таблицу резервировать - зависит от природы вышеуказанного требования. Я подозреваю - что никакую :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 12:44 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
hvlad, Требование возникло из того факта, что закрытие периода (месяца в нашем случае) подводит итог работы автотранспортного предприятия за этот период. Это значит, что все отчеты по основным показателям уже не могут меняться, в том числе и зарплата водителей, кстати. Поэтому прошлые периоды доступны только для просмотра. И если кто-то в момент или после закрытия все еще вводит или меняет документы из старого периода, а кто-то уже перешел на новый то возникнет неразбериха. Насчет резервирования таблиц я тоже задумывался. Спасибо за совет, Влад. Но решил, что табличка подключений, которую присоветовал fraks в реализации попроще будет. Тем более, что если сделать структуру похожей на mon$attachments, то и менять нужно будет очень мало. В общем уже сделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:42 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvicИ если кто-то в момент или после закрытия все еще вводит или меняет документы из старого периода, а кто-то уже перешел на новый то возникнет неразбериха. И что вы со своей системой будете делать если кто-то не успел завести пару документов закрытого периода? Дай угадаю: переоткрываете его?.. Лучше бы вам таки переделать дизайн пока не поздно... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:52 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvic, проверять наличие подключений это в корне не правильный путь. Ведь при выполнении процедуры закрытия периода важно чтоб никто не писал (добавлял/модифицировал/удалял документы), но это не обозначает что никто не может читать. Про mon$attachments 1. в 4.0 таки можно читать инфу о других подключениях если чтение идёт в процедуре с SQL SECURITY DEFINER 2. в более младших версиях можно извратиться через EXECUTE STATEMENT ... AS USER SYSDBA или EXECUTE STATEMENT ... AS USER MON$ADM ... ROLE RDB$ADMIN ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:58 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Таки да, переоткрываем. Но таких случаев за все время был один. Если бы не зарплата, то можно было бы подумать над изменением. А с зарплатой исключено. В день закрытия, это обычно число 5е-10е месяца, зарплата уже посчитана и выданы расчетные листки. Что-либо вводить или менять уже точно поздно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:04 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvic Требование возникло из того факта, что закрытие периода (месяца в нашем случае) подводит итог работы автотранспортного предприятия за этот период. Это значит, что все отчеты по основным показателям уже не могут меняться, в том числе и зарплата водителей, кстати. Поэтому прошлые периоды доступны только для просмотра. И если кто-то в момент или после закрытия все еще вводит или меняет документы из старого периода, а кто-то уже перешел на новый то возникнет неразбериха. Т.е. достаточно иметь поле с состоянием периода (открыт, закрыт) и проверять его состояние перед внесением изменений. Думаю, это уже и так сделано. Тогда, при закрытии периода, достаточно резервировать таблицу с периодами в режиме exclusive write. Тут есть один недостаток - пока период закрывается, никто не сможет читать таблицу периодов. Способ это обойти есть и я его покажу, если есть интерес. Главная проблема с таблицей подключений - её нужно будет периодически проверять на наличие неудалённых (из-за сбоев) записей. Тут уже обсуждали когда триггер на дисконнект не вызывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:16 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvicВ день закрытия, это обычно число 5е-10е месяца, зарплата уже посчитана и выданы расчетные листки. То есть, внезапно, можно ограничивать ввод не любых документов, а только влияющих на зарплату и вместо "закрытого периода" можно использовать "наличие расчётного листка". А чтобы не париться с конкурентным вводом - создавать его черновик за пару дней до настоящего. И таки опять же: что если кто-то реально забыл ввести такой документ, а листки уже напечатаны и розданы? Что толку в закрытии/переоткрытии? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:17 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Симонов Денис, По сути твое замечание верно, но я не зря в первом посте сделал оговорку насчет масштабов базы/приложения. Выгнать юзеров на время закрытия не большая проблема. Сама процедура длится не больше пяти минут со всеми архивированиями. Плюс пользователи видят перед собой текущий период. Если они не закрывают приложение, то нужно что-то мутить с событиями, чтобы понять в какой момент текущий период должен стать прошлым. За советы спасибо. Насчет EXECUTE STATEMENT тоже подумывал, но решил, что реализовать свою attachments проще ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:23 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Если кто-то ошибся с документами влияющими на зарплату, или сами данные пришли слишком поздно (больничные, разные справки), то все компенсируется в следующем месяце. Такой механизм существует везде, насколько я знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:27 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvicто все компенсируется в следующем месяце Воот. То есть твои закрытия периодов - не более чем известное детское желание "чтобы слоники бегали". Софт должен облегчать своим пользователям работу, а не создавать её. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:38 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
hvlad Я не вижу тут требования выхода из программы. Есть требование не изменять состояние в закрытых и закрываемых периодах. Т.е. достаточно иметь поле с состоянием периода (открыт, закрыт) и проверять его состояние перед внесением изменений. Думаю, это уже и так сделано. Тогда, при закрытии периода, достаточно резервировать таблицу с периодами в режиме exclusive write. Тут есть один недостаток - пока период закрывается, никто не сможет читать таблицу периодов. Способ это обойти есть и я его покажу, если есть интерес. Главная проблема с таблицей подключений - её нужно будет периодически проверять на наличие неудалённых (из-за сбоев) записей. Тут уже обсуждали когда триггер на дисконнект не вызывается. Сразу не увидел твой пост. Да все так. Ответил уже Симонову Денису. Его замечание было практически аналогично твоему. Состояние периода (открыт/закрыт) реализовано несколько иначе. Есть таблица итогов, а не периодов. Записи там появляются как раз в момент закрытия. Соответственно незакрытым считается период , следующий за последним в этой таблице. Он же текущий если пользователь не переключился на более ранний. Переключиться кстати могут не все. Если пользователь переключился на более ранний, то текущий и незакрытый периоды не совпадают, и в этом случае изменения запрещены. Насчет сбоев спасибо. Реализую наверно в кроне удаление зависших записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 15:06 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Чтобы развеять мнение насчет неудобств пользователям, создаваемым требованием выхода на момент закрытия. Такая схема работает уже очень давно. Лет двадцать, не меньше. Само приложение я перевел недавно на firebird с другим гуем. До того было сделано на древнем парадоксе. Менять всю схему приложения даже мыслей не было. Потому что в одиночку (а больше некому) чересчур сложно, да и пользователи нифига не оценят, скорее наоборот. Сама проблема коннектов и предупреждения возникла в этом году. Приложением захотела попользоваться еще одна автобаза. Наши и так административными мерами запрещали вход в программу пока идет сверка всех отчетов перед закрытием. Саму сверку проводят один, два человека. Ну а само закрытие естественно один. А вот у соседей замечал, что в момент закрытия не все пользователи выходят. Вот и решил подстраховаться чтобы не было возможности сделать критическую ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 15:38 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Ну да, ну да, привычный геморрой за геморрой не считается. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:02 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Ну да, ну да, привычный геморрой за геморрой не считается. Рекомендации озвучены, плюсы и минусы рассмотрены - дальше выбирает тот, кто делает и потом сопровождает, а не тот, кто ищет развлечение. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:05 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
Поразмыслив решил таки, что своя attachments с триггерами и постоянной проверкой, что какое-то подключение может сбойнуть и не удалить себя слишком геморно и не надежно. Решил использовать execute statement ... as user ... . Но получилось сделать только с SYSDBA. А других пользователей firebird кроме SYSDBA у меня нет. Используется trusted authentication. Не очень хочется светить пароль sysdba. Свою учетку я примапил во всех базах к роли RDB$ADMIN. Вопрос - можно как-то ее использовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 09:33 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvic Используется trusted authentication. Не очень хочется светить пароль sysdba Либо передавать его из приложения через пар-р процедуры. stelvic Свою учетку я примапил во всех базах к роли RDB$ADMIN. Вопрос - можно как-то ее использовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 12:39 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
hvlad См (2) в 22417373 Что-то не могу никак сообразить. С сисдба получилось сразу: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
В варианте с доменной учеткой всегда посылает к администратору за логином фаерберда. Или имелось в виду завести пользователя фаерберд для этого случая? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 14:10 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
stelvic, если ты указал 'AS USER', то никакой trusted auth уже не будет. Firebird будет пытаться искать указанного юзера в своей security.db. Если же AS USER не указывать, то для локального коннекта (как в твоём примере) будет embedded доступ с SQL-аккаунтом текущего SQL юзера. Для сетевого коннекта без указания AS USER будет пробоваться trusted auth с аккаунтом OS, под которым работает процесс Firebrid ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 14:28 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
hvlad, Я совсем запутался. Я думал, что если не указывать as user, то будет current_user. Локального коннекта быть не может. Сервер и база находятся на другом компе. Примеры выполнял в ibexperte. Соединение указывал remote tcp/ip, ip-адрес сервера, алиас базы. Попробовал убрать as user оставил role 'rdb$admin'. На роль никак не отреагировал. Просто выдал все коннекты текущего пользователя как если ввести простой 'select * from mon$attachments'. Только без звездочки, а с полями из примера. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 14:56 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
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'. На роль никак не отреагировал. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 15:10 |
|
mon$attachments
|
|||
---|---|---|---|
#18+
hvlad, Так ты on external имел в виду? Ну что ж. Спасибо за терпение. :) Такой вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7.
сработал. Правда вначале тоже выдал только одну запись с юзером с именем сервака в домене. Но после того как подмапил ему роль rdb$admin уже получил все. Плюс еще одну правда, но это уже мелочь. Еще подумалось, что это нехилая такая дыра в безопасности получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 17:54 |
|
|
start [/forum/topic.php?fid=40&fpage=2&tid=1559848]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 157ms |
0 / 0 |