|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
Господа здравствуйте. Есть логическая еденица - том. Он состоит из 4-х таблиц. 1. Таблица STO - хранилище документов 2. Таблица VOL - полей тома, собственно то, что видит в гриде пользователь. 3. Таблица NDF - со служебной информацией о томе. 4. Таблица GEN - со списками генераторов тома. Работа идет через ОДБС. Когда пользователь в приложении открывает том, то считывается необходимая информация из служебных таблиц NDF, GEN и создается Рекордсет на таблицу VOL, который и открывается. Пользователь начинает работать. Ситуация. Несколько пользователей открыли один и тот же том и работают с ним. В это время один из них заканчивает эту работу и решает том удалить. Как это реализовано? Идут обычные DROP TABLE для всех 4-х таблиц. Но первой в данном списке стоит VOL таблица. Так как если ОДБС _НЕ_ выкинет исключение, что невозможно удалить таблицу (потому что она занята), то это с вероятностью в 99% будет означать, что удаление остальных трех таблиц пройдет без проблем. Т.к. невозможность удаления тома связана почти всегда именно с открытым томом, а значит с открытым рекордсетом на таблицу VOL. Такой способ применяется ввиду невозможности отката операции удаления таблицы. Все было бы хорошо, если бы не некоторая особенность в поведении отдельных СУБД, с которыми идет работа. В частности, это ИБ 6 и Фокс 6. Они обрабатывают её некорректно. Например: - ИБ: При попытке удаления таблицы VOL, которая щас занята выкидывается эксэпшэн, что мол извини.. Но затем при попытке селекта из этой таблицы в данной сессии валятся ошибки, что такая таблица не существует. Если перелогиниться, то все становится нормально. Мелочь, но пользователям очень неприятно. - Фокс: В некоторых ситуациях при явно занятой таблице спокойно позволяет её удалить др. клиенту. А некоторых выкидывает нужное сообщение Access denied. Ввиду этих причин необходимо разработать единый механизм для ИБ6, Фокса, Оракла, СКЛ Сервера (хотя последние 2 абсолютно правильно отрабатывают все эти ситуации и их в принципе можно искл. из списка), который бы позволял идентефицировать занятость таблиц тома перед их уделанием не посредством анализа успешной или неуспешной операции DROP TABLE, а как-то иначе. И в случае когда хоть одна из таблиц занята, в целом, запрещать операцию удаления тома. Я так думаю, что можно на все таблицы и не заморачиваться, а пытаться идентефицировать только статус VOL таблицы. Хотя анализ всех был бы предпочтительней. Есть у кого-нибудь идеи? мне что-то пока ничего более-менее надежного в голову не приходит. Может уже кто-то сталкивался с такими вещами или на сей счет есть уже готовые паттерны? Буду признателен за любые советы в каком направлении рыть. Напомню, что вся работа ведется через ОДБС. Евгений. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 08:49 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
В Oracle не является "правилом хорошего тона" при реализации бизнес-логики приложения - динамическое создание и удаление таблиц. Обычно структура БД разрабатывается один раз и эта структура есть физическое представление логической структуры, в которой определены сущности, их атрибуты, связи между сущностями. При работе пользователей БД, должна меняться не логическая и физическая структура а лишь сами данные. Тот подход который применялся в FoxPro здесь абсолютно не применим. А удаляя таблицы ты изменяешь структуру, уничтожаешь связи. Если тебе необходимо иметь временные таблицы - это уже другой вопрос. Использование временных таблиц не должно быть основой БД, их надо использовать как вспомогательное стредство. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 09:50 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
Специфика проекта такова, что нет в нем понятия структура БД, о котором Вы говорите. Точнее есть, но она очень и очень динамическая, постоянно меняется. Долго писать для чего это нужно, но проект очень специфический. Вопрос собственно остается.... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 10:14 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
Ну нихрена себе стурктурка!!!!! Так же ведь никто не делает! (до такого никто не дадумывался) Делайте нормальную структуру БД, тогда таких вопросов возникать не будет. И не говори, что по-другому невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:01 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
Если можно, то отвечать по существу, пожалуйста, воду лить не нужно... Мне не нравится Винда, это же не значит, что я на вопросы по обходу её глюков отвечаю, что пусть МС её переделывает.. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:40 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
А вы имеете вообще понятие о теории реляционных БД? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:48 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
А почему бы не написать 4 разные реализации механизма удаления таблиц для всех СУБД и вызывать актуальную для текущей? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:52 |
|
DROP TABLE Question
|
|||
---|---|---|---|
#18+
Кстати, Код: plaintext 1. 2. 3.
есть симптомы, что неправильно настроена работа сетевого клиента -- в первом случае сервер не отрабатывает file level locking. В Новеле это будет автоматически, в Самбе нужно специально включать. Насчёт честности NT и NFS не уверен. Но сдаётся мне, в случае с NT это конфигурится. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2002, 03:08 |
|
|
start [/forum/topic.php?fid=52&msg=32071238&tid=1992651]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 247ms |
total: | 365ms |
0 / 0 |