![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли определить таблицу и запись , которая не даёт удалить...
Prohodil Mimo © (2008-02-08 12:38:00)база - FB_2
Есть несколько таблиц, создавались примерно так:
CREATE TABLE TEBLE_1(
ID_T1 INTEGER NOT NULL,
T1_NAME VARCHAR(10),
PRIMARY KEY(ID_T1));
CREATE TABLE TEBLE_2(
ID_T2 INTEGER NOT NULL,
ID_T1 INTEGER REFERENCES TABLE_1(ID_T1) ON DELETE CASCADE,
T2_NAME VARCHAR(10),
PRIMARY KEY(ID_T2));
CREATE TABLE TEBLE_3(
ID_T3 INTEGER NOT NULL,
ID_T2 INTEGER REFERENCES TABLE_2(ID_T2),
T3_NAME VARCHAR(10),
PRIMARY KEY(ID_T3));
CREATE TABLE TEBLE_4(
ID_T4 INTEGER NOT NULL,
ID_T1 INTEGER REFERENCES TABLE_1(ID_T1) ON DELETE CASCADE,
T4_NAME VARCHAR(10),
PRIMARY KEY(ID_T4));
CREATE TABLE TEBLE_5(
ID_T5 INTEGER NOT NULL,
ID_T4 INTEGER REFERENCES TABLE_4(ID_T4),
T5_NAME VARCHAR(10),
PRIMARY KEY(ID_T5));
При попытке удалить запись из таблицы 1, выдаётся сообщение, что нельзя удалить запись, т.к. она используется в таблице такой-то.
А можно ли как-то определить, какая таблица, в какой записи держит ту, которую хотят удалить?
Например, хотят удалить запись из Т1, в системном сообщении будет видно, что нельзя удалить запись т.к. она используется в Т5. А я хочу вместо этого сообщения выводить своё, наподобие (Нельзя удалить эту запись т.к. в таблице Т5 "содержимое поля T5_NAME" используется запись из таблицы TEBLE_4 и т.д.)
Возможно ли получить какие-то данные именно при получении сообщения об ошибке или в случае отказа сервера удалить запись, вручную перебирать таблицы и записи и проверять, кто же не даёт удалить?
Пример сильно упрощённый.
Сергей М. (2008-02-08 15:01:00) [21]
> хочу указать имена документов и т.п.
А где и как у тебя определены соответствия "Документ (или справочник) -> ТакаяТоТаблица (или группа таких-то таблиц)" ?
Prohodil Mimo (2008-02-08 14:50:00) [22]Сергей М. © (08.02.08 13:03) [5]
Сообщить пользователю, что, мол, нельзя удалить такой-то элемент такого-то справочника, поскольку на него ссылаются такие-то элементы таких-то документов - это еще куда ни шло,
вот именно это я и хочу. Пользователю не надо знать имён таблиц, я ему хочу указать имена документов и т.п.
ANB (08.02.08 12:50) [1]
перехватывать ошибку, лезть словарь и смотреть по какому полю Т5 ссылается на Т1. Ну и формировать свое сообщение.
в том то и дело, что таких таблиц, как Т5 - целая куча и всех проверять не очень то охота. Если ошибка выдана сервером, значит он уже нашёл всё что мне надо, но вот как у него узнать то, что он нашёл, а не только поверхностные данные.
sniknik © (08.02.08 12:58) [3]
REFERENCES это типа внешнего ключа в MSSQL?
да, это и есть внешний ключ.
Использую FIBPlus.
Sergey13 (2008-02-08 13:45:00) [23]> [0] Prohodil Mimo © (08.02.08 12:38)
> Возможно ли получить какие-то данные именно при получении
> сообщения об ошибке или в случае отказа сервера удалить
> запись, вручную перебирать таблицы и записи и проверять,
> кто же не даёт удалить?
Так это смотря чего тебе хочется - универсальную проверялку ошибок или обработку конкретного случая. Естественно для первого варианта придется системный таблицы анализировать, во втором проще опросить уже известные таблицы.
Но самое простое и правильное, ИМХО, не конкретизировать в данном случае ошибку. Иначе например если "мешается" не одна запись, а 100 или даже 1000000 (да еще и в разных таблицах!) - что, выводить их список что ли? Тут надо думать про логику работы в целом, что бы "автоматом" не получать таких обломов.
Desdechado (2008-02-08 13:26:00) [24]> потребует ведения минимальных метаданных на русском языке.
Не вижу необходимости. Документ (или что угодно) может состоять хоть из полусотни таблиц. Но для юзера это единое целое. Ему до фени, как оно хранится.
ANB (2008-02-08 13:04:00) [25]
> А что, пользователи у тебя оперируют не понятиями предметной
> области, а понятиями БД? Нафига им знать об именах таблиц,
> об их взаимосвязях и полях?
Это уже шаг 2. Но он потребует ведения минимальных метаданных на русском языке.
Сергей М. (2008-02-08 13:03:00) [26]
> Нельзя удалить эту запись т.к. в таблице Т5 "содержимое
> поля T5_NAME" используется запись из таблицы TEBLE_4 и т.
> д
Сообщить пользователю, что, мол, нельзя удалить такой-то элемент такого-то справочника, поскольку на него ссылаются такие-то элементы таких-то документов - это еще куда ни шло, но за каким лешим пользователю знать всю внутреннююкухню твоей базы ?
Desdechado (2008-02-08 12:59:00) [27]> сообщения выводить своё, наподобие (Нельзя удалить эту запись
> т.к. в таблице Т5 "содержимое поля T5_NAME" используется
> запись из таблицы TEBLE_4
А что, пользователи у тебя оперируют не понятиями предметной области, а понятиями БД? Нафига им знать об именах таблиц, об их взаимосвязях и полях?
sniknik (2008-02-08 12:58:00) [28]REFERENCES это типа внешнего ключа в MSSQL? тогда оно должно определяться, в FB там все из системных таблиц привыкли получать...
а в ADO к примеру есть общий механизм - схемы (т.е. если вдруг используеш его... неважно что FB/другое). тут уж от провайдера данных зависит поддерживает он их или нет.
Сергей М. (2008-02-08 12:51:00) [29]А каой тип объединения ты используешь ?
ANB (2008-02-08 12:50:00) [30]Ну так, навскидку - перехватывать ошибку, лезть словарь и смотреть по какому полю Т5 ссылается на Т1. Ну и формировать свое сообщение.\
ЗЫ. Вот не люблю мс скл, но у него самые понятные ошибки