права пользователя & вылет клиента при обрыве связи
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
права пользователя & вылет клиента при обрыве связи
Пишу бд на fb 1.5 и клиент под неё на delphi7.
Возникли следующие вопросы:
1. Как можно вытянуть из базы
права которыми обладает подключившийся пользователь для доступа к бд( вариант реализации на клиенте или на сервере значения не имеет ).
2. При работе клиента с бд, в случае краха сервера fb и повторном его включении доступа к бд нет.
При попытке закрыть клиента он вылетает с ошибкой. Как можно это обойти.
Прибывал вариант с повторным залогиниванием к бд(с предварительным отключением
компонентов ibdb.forceclose и т.п.), но в лучшем случае компонент
ibdatabase переходит в состояние true, но sql запросы не проходят и доступа к БД нет.
(компоненты:IBDatabase1,DataSource1,IBQuery1,IBTransaction1, IBStoredProc1)
Возникли следующие вопросы:
1. Как можно вытянуть из базы
права которыми обладает подключившийся пользователь для доступа к бд( вариант реализации на клиенте или на сервере значения не имеет ).
2. При работе клиента с бд, в случае краха сервера fb и повторном его включении доступа к бд нет.
При попытке закрыть клиента он вылетает с ошибкой. Как можно это обойти.
Прибывал вариант с повторным залогиниванием к бд(с предварительным отключением
компонентов ibdb.forceclose и т.п.), но в лучшем случае компонент
ibdatabase переходит в состояние true, но sql запросы не проходят и доступа к БД нет.
(компоненты:IBDatabase1,DataSource1,IBQuery1,IBTransaction1, IBStoredProc1)
-
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
Re: права пользователя & вылет клиента при обрыве связи
1. Это грубейшее нарушение правил безопасности. Пользователь не должен занть свои права, права должен знать тот, кто их проверяет. Тут тебе не гнилая американская демократия.
2. А транзакции?
2. А транзакции?
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
Глянь на всякий пожарный компонентики на Interbase Admin на эту тему. Сам не пользую, посему не уверен, но чем чёрт не шутит. Если нет - в LangRef, System Tables And Views, вокруг таблицы rdb$user_privelegies.Konstantin_ писал(а):1. Права пользователя нужны чтобы заблокировать или наоборот,разблокировать функции для доступа/редактирования данных на клиенте.
Ну не умеет IBX корректно обрабаывать обрыв, не-у-ме-ет. На сайте где мы с тобой прямо щас балаболим, есть пара статей с вариантами обучения его этому, про обе автор IBX невнятно бурчал, что они не полностью корректны. Но у него вообще все программы, кроме евонных - суксь. Я так в таких случаях просто включаю дурочку, то бишь игнорирование всех exceptions и Application.Terminate, благо в локалке это явление редкое, а удалённые АРМ у меня работают через application server.Konstantin_ писал(а): 2. Все транзакции rollback или commite и в итоге све равно крах.
-
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
Неправильный ответ. Права не нужны на клиенте. Это не мое мнение, это так надо.Konstantin_ писал(а):Права пользователя нужны чтобы ... на клиенте.
Что это значит?Konstantin_ писал(а): Все транзакции rollback или commite и в итоге све равно крах.
Я имел в виду, что стартовать надо транзакии после восстановления соединения, и только потом запросы открывать.
-
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
1. Написав
=>Права пользователя нужны чтобы ... на клиенте.<=
я хотел узнать какие операции может выполнять подключившийся пользователь в бд, и исходя из этого заблокировать лишние функции в клиенте и т.п.
2. В случае повторного подключения после краха и старта транзакций,
удается получить доступ к первой таблице, но к остальным таблицам достцпа так и нет. КАК БЫТЬ !
=>Права пользователя нужны чтобы ... на клиенте.<=
я хотел узнать какие операции может выполнять подключившийся пользователь в бд, и исходя из этого заблокировать лишние функции в клиенте и т.п.
2. В случае повторного подключения после краха и старта транзакций,
удается получить доступ к первой таблице, но к остальным таблицам достцпа так и нет. КАК БЫТЬ !
Уважаемый MuirsheenDurkin!MuirsheenDurkin писал(а):Уважаемый Merlin!
По моим данным после выдачи любого гранта на rdb$user_privelegies все остальные болт получат из этой таблицы. Да и идейно неправильно это.
А по моим данным выдача грантов на системные таблицы в FB является наивным хаком, с успехом ликвидируемым путём backup-restore. По нутру же самого сервера доступ к системным таблицам регулируется правилами не SQL, а GDML, то бишь - что не запрещено, то разрешено. В чём идейная неправильность дизабледения-енаблядения конопучек на формах на основании данных из означенной таблицы, я тоже не очень отчётливо. Имена таблиц как и так в программе фигурируют. Другое дело, что при достаточно сложной структуре объектов и прав это становится неээффективным делом, но это проблема вопрошающего. Кстати, упомянутый перевод доступа к системным таблицам на SQL-рельсы насильственным хакерским способом тоже быстродействия не добавляет. И при наличии достаточного количества объектов в базе и достаточного количества юзеров очень и очень не добавляет.
Возможно у нас разные в этом плане IBX. Может Джефф чего и довёл до ума в последних, я от его дерева довольно давно свой отросток пустил и к нему с тех пор не заглядываю.MuirsheenDurkin писал(а): И насчет обрыва. Дело не в IBX, по-моему. В общем, у меня все восстанавливается нормально.
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
Здесь код за вопрошающих не пишут, здесь пинают в нужную сторону и только. С правами. Читать Language Reference с целью изучения как права лежат в упомянутой таблице и сочинить достающий их оттуда запрос. С результатами его обращаться по вкусу. С вылетом. Иди на www.ibase.ru , в раздел Статьи, искать на тему методов восстановления коннекта в IBX. Или освежить IBX, если MuirsheenDurkin прав.Konstantin_ писал(а):По последним двум постам я так и не понял как мне решить проблему с правами и вылетом клиента.
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
-
- Сообщения: 44
- Зарегистрирован: 21 янв 2005, 10:18
Константину.
Насчет прав - делай select из RDB$USER_PRIVILEGES, Merlin разрешил. Начет обрыва - забей и в случае обрыва закрывай приложение. Источники те же.
Merlin'у:
С Вашими аргументами согласен, но имею предложить свои. То, что пользователь узнает о правах, данных не ему - чистая дырка в безопасности, это, я надеюсь понятно. Просто потому, что сам факт выдачи какого-либо права может являться секретом. А располагая механикой получения всех своих прав он сможет думать о том, как ему все это по кривой объехать. А так у него лишних мыслей не возникает. Что всегда хорошо.
Насчет IBX. В случае обрыва коннекта я закрываю все датасеты (close), прибиваю все IBSQL, Rollback всем TTransaction, Start всем транзакциям, open всем dataset'ам. Все работает, в смысле, жалоб нет. Хотя ситуация досточно редкая, может, по статистике повезло. IBX ныне действующий.
Насчет прав - делай select из RDB$USER_PRIVILEGES, Merlin разрешил. Начет обрыва - забей и в случае обрыва закрывай приложение. Источники те же.
Merlin'у:
С Вашими аргументами согласен, но имею предложить свои. То, что пользователь узнает о правах, данных не ему - чистая дырка в безопасности, это, я надеюсь понятно. Просто потому, что сам факт выдачи какого-либо права может являться секретом. А располагая механикой получения всех своих прав он сможет думать о том, как ему все это по кривой объехать. А так у него лишних мыслей не возникает. Что всегда хорошо.
Насчет IBX. В случае обрыва коннекта я закрываю все датасеты (close), прибиваю все IBSQL, Rollback всем TTransaction, Start всем транзакциям, open всем dataset'ам. Все работает, в смысле, жалоб нет. Хотя ситуация досточно редкая, может, по статистике повезло. IBX ныне действующий.
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
Re: права пользователя & вылет клиента при обрыве связи
По второму вопросу, посмотри компоненнты FIBPlus. Там есть компоненты, способные пережевать событие Lost CinnectKonstantin_ писал(а):Пишу бд на fb 1.5 и клиент под неё на delphi7.
Возникли следующие вопросы:
1. Как можно вытянуть из базы
права которыми обладает подключившийся пользователь для доступа к бд( вариант реализации на клиенте или на сервере значения не имеет ).
2. При работе клиента с бд, в случае краха сервера fb и повторном его включении доступа к бд нет.
При попытке закрыть клиента он вылетает с ошибкой. Как можно это обойти.
Прибывал вариант с повторным залогиниванием к бд(с предварительным отключением
компонентов ibdb.forceclose и т.п.), но в лучшем случае компонент
ibdatabase переходит в состояние true, но sql запросы не проходят и доступа к БД нет.
(компоненты:IBDatabase1,DataSource1,IBQuery1,IBTransaction1, IBStoredProc1)
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
В случае разрыва соединения с сервером пробывал вариант с полным пересозданием вcех компонентов связанных с работой БД( ibdb.free, и т.д. затем их создание + переопределение связей между ними через дин.созд.об ). Объекты создаются успешно, запросы работают, но при разрыве связи с сервером все равно вылетает ошибка потери соединения.
Кто знает как можно по нормальному обработать разрыв с сервером кроме как переход на FIBPLUS////
Кто знает как можно по нормальному обработать разрыв с сервером кроме как переход на FIBPLUS////
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
С починкой сети все понятно, но соединение после разрыва можно восстановить (как вариант проблемы - остановка сервера fb и повторный запуск при работе на локальной машине). Вот здесь и проблема с обращением к БД после разрыва связи.
Как восстановить связь клиента с БД если соединение восстановилось(LAN) а клиентское приложение например пытается выполнить запрос и т.п.
Как восстановить связь клиента с БД если соединение восстановилось(LAN) а клиентское приложение например пытается выполнить запрос и т.п.
нельзя ничего восстановить! клиент работает с сервером В КОНТЕКСТЕ tcp (или другого) соединения. И когда соединение оборвано операционной системой, этот контекст восстановить НЕЛЬЗЯ.но соединение после разрыва можно восстановить (как вариант проблемы - остановка сервера fb и повторный запуск при работе на локальной машине). Вот здесь и проблема с обращением к БД после разрыва связи.
Рассматривайте это как обрыв при закачке файла с сервера, который не поддерживает докачку.
никак, уже ведь сказали. Все способы реконнекта для IBX и в FIBPlus это повторный коннект. Это не восстановление соединения. Это осуществление соединения ЗАНОВО.Как восстановить связь клиента с БД если соединение восстановилось(LAN) а клиентское приложение например пытается выполнить запрос и т.п.
что касается самого транспорта, например tcp, то за восстановление отвечает операционная система (стек tcp), и если на этом уровне соединение восстановить ей не удалось, то для сервера это 100% обрыв связи.
-
- Сообщения: 25
- Зарегистрирован: 15 апр 2005, 13:45
За разъяснения спасибо, но у меня встречный вопрос:
почему не удается установить НОВОЕ соединение, если я выполняю удаление всех компонентов, а затем их создаю заново, + устанавливаю связи между ними. В итоге если связь с сервером есть то при динамическом пересоздании объектов, клиент прекрасно работает, но если ручками остановить сервис FB и снова выполнить пересоздание объектов + выполнить элементарный запрос к БД, то идет ошибка потери соединения. С чего бы ЭТО если со старым соединением связи уже нет?
почему не удается установить НОВОЕ соединение, если я выполняю удаление всех компонентов, а затем их создаю заново, + устанавливаю связи между ними. В итоге если связь с сервером есть то при динамическом пересоздании объектов, клиент прекрасно работает, но если ручками остановить сервис FB и снова выполнить пересоздание объектов + выполнить элементарный запрос к БД, то идет ошибка потери соединения. С чего бы ЭТО если со старым соединением связи уже нет?
потому что при потере соединения базовый IBX не в состоянии корректно обработать эту ситуацию. И поэтому на сайте есть соотв методы (две штуки) доработки IBX. А в FIBPlus долго и мучительно писали соответствующий код.
Но - обрыв соединения считается нештатной ситуацией. То есть, после него надо закрывать программу и открывать по новой. Потому что закрытие TIBDatabase и его переоткрытие - это фактически то же самое, что и перезапуск приложения.
Но - обрыв соединения считается нештатной ситуацией. То есть, после него надо закрывать программу и открывать по новой. Потому что закрытие TIBDatabase и его переоткрытие - это фактически то же самое, что и перезапуск приложения.