-
база - 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 и т.д.) Возможно ли получить какие-то данные именно при получении сообщения об ошибке или в случае отказа сервера удалить запись, вручную перебирать таблицы и записи и проверять, кто же не даёт удалить?
Пример сильно упрощённый.
-
Ну так, навскидку - перехватывать ошибку, лезть словарь и смотреть по какому полю Т5 ссылается на Т1. Ну и формировать свое сообщение.\
ЗЫ. Вот не люблю мс скл, но у него самые понятные ошибки
-
А каой тип объединения ты используешь ?
-
REFERENCES это типа внешнего ключа в MSSQL? тогда оно должно определяться, в FB там все из системных таблиц привыкли получать... а в ADO к примеру есть общий механизм - схемы (т.е. если вдруг используеш его... неважно что FB/другое). тут уж от провайдера данных зависит поддерживает он их или нет.
-
> сообщения выводить своё, наподобие (Нельзя удалить эту запись > т.к. в таблице Т5 "содержимое поля T5_NAME" используется > запись из таблицы TEBLE_4 А что, пользователи у тебя оперируют не понятиями предметной области, а понятиями БД? Нафига им знать об именах таблиц, об их взаимосвязях и полях?
-
> Нельзя удалить эту запись т.к. в таблице Т5 "содержимое > поля T5_NAME" используется запись из таблицы TEBLE_4 и т. > д
Сообщить пользователю, что, мол, нельзя удалить такой-то элемент такого-то справочника, поскольку на него ссылаются такие-то элементы таких-то документов - это еще куда ни шло, но за каким лешим пользователю знать всю внутреннюю кухню твоей базы ?
-
> А что, пользователи у тебя оперируют не понятиями предметной > области, а понятиями БД? Нафига им знать об именах таблиц, > об их взаимосвязях и полях?
Это уже шаг 2. Но он потребует ведения минимальных метаданных на русском языке.
-
> потребует ведения минимальных метаданных на русском языке. Не вижу необходимости. Документ (или что угодно) может состоять хоть из полусотни таблиц. Но для юзера это единое целое. Ему до фени, как оно хранится.
-
> [0] Prohodil Mimo © (08.02.08 12:38) > Возможно ли получить какие-то данные именно при получении > сообщения об ошибке или в случае отказа сервера удалить > запись, вручную перебирать таблицы и записи и проверять, > кто же не даёт удалить?
Так это смотря чего тебе хочется - универсальную проверялку ошибок или обработку конкретного случая. Естественно для первого варианта придется системный таблицы анализировать, во втором проще опросить уже известные таблицы. Но самое простое и правильное, ИМХО, не конкретизировать в данном случае ошибку. Иначе например если "мешается" не одна запись, а 100 или даже 1000000 (да еще и в разных таблицах!) - что, выводить их список что ли? Тут надо думать про логику работы в целом, что бы "автоматом" не получать таких обломов.
-
Сергей М. © (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.
-
> хочу указать имена документов и т.п.
А где и как у тебя определены соответствия "Документ (или справочник) -> ТакаяТоТаблица (или группа таких-то таблиц)" ?
-
Сергей М. © (08.02.08 15:01) [10] А где и как у тебя определены соответствия "Документ (или справочник) -> ТакаяТоТаблица (или группа таких-то таблиц)" ?
Это уже другое. Как вывести человеческим языком - для меня не проблема. У меня в данном случае проблема получить имя таблицы, которая держит запись, сам ИД записи, а так же имя таблицы в которой эта запись находится. И проблема не в том, что я не знаю ни одного способа, а в том, что мне этот способ не нравится, т.к. он аналог перебора вручную.
А если я буду удалять через ХП, не легче будет? или там мне будут доступны те же данные, что и на клиенте?
-
> ЗЫ. Вот не люблю мс скл, но у него самые понятные ошибки
Хм, по-моему у него самые ниочемнеговорящие сообщения об ошибках аля "Incorrect syntax near ..." Ну это так, имхо!
-
ИМХО, тут явно тот случай, когда изменения (в т.ч. удаления и вставки) в таблицы надо реализовать через хранимки или триггеры - тогда вся логика будет описана в одном месте - на сервере.
-
> megabyte (08.02.2008 16:08:12) [12]
А ты что знаешь другие методы, когда синтаксис неверен?
-
> megabyte © (08.02.08 16:08) [12]
При ошибках ДМЛ он понятно сообщается в какой таблице и что именно ему не нравится. В оракле, например, частенько не пишется ни имя таблицы ни имени поля, из за которого возникли проблемы. Просто выкидывается константа, которая соответствует коду ошибки.
-
Автору:
Покажи описание триггеров, будет все понятно
-
на данный момент
-
SELECT 'TEBLE_2' ItsWhere, TEBLE_2.ID_T2 ItsWho FROM TEBLE_2 WHERE TEBLE_2.ID_T1 = @T1_ID UNION SELECT 'TEBLE_4' , TEBLE_4.ID_T4 FROM TEBLE_4 WHERE TEBLE_4.ID_T1 = @T1_ID
P.Ы. Откуда такая извращенная фантазия при наименовании таблиц и полей?
-
> P.Ы. Откуда такая извращенная фантазия при наименовании > таблиц и полей?
Это еще не извращенная - хотя бы видно ИД и ФК. Эт ты АИС Налог не видел :)
-
> ЮЮ (12.02.2008 12:07:18) [18]
Немец, айн, цвай, драй, полицай, то есть пожизненый цик с гвоздями. Но авторы это могут красиво обосновывать.
-
-
ЮЮ © (12.02.08 12:07) [18] P.Ы. Откуда такая извращенная фантазия при наименовании таблиц и полей?
это просто пример, что бы понятнее и нагляднее было и было видно ИД и ФК. Или надо было кусок реальной базы запостить?
Сергей М. © (14.02.08 9:23) [21] спасибо, но вопрос был не об этом. Как это всё получить я и так знаю, я просто искал более простой путь, а вернее хотел узнать, нельзя ли получить именно то место, о которое запнулся сервер. Он то его уже и так нашёл, мог бы и поделиться координатами, вместо простого сообщения, что запнулся. А так я получил отказ и начинаю сам продклывать тот же путь для выяснения где это произошло. А хотклось бы без такого.
-
> Он то его уже и так нашёл, мог бы и поделиться координатами
При попытке удалить master-запись из таблицы 'Lesson', он ничего не скрывает и точно указывает координаты:
DELETE statementt conflicted with COLUMN REFERENCE constraint 'FK_TeacherConnections_Lessons'. The conflict occured in database 'Tests', table 'TeacherConnections', column 'Lesson'. Statement nas been terminated.
а если тебя интересует конкретный ID, то кто мешает при при исключении под IDE посмотреть текст SQL, выполнение которого привело к ошибке?
-
ЮЮ © (26.02.08 3:02) [23] DELETE statementt conflicted with COLUMN REFERENCE constraint 'FK_TeacherConnections_Lessons'. The conflict occured in database 'Tests', table 'TeacherConnections', column 'Lesson'. Statement nas been terminated.
это FB выдаёт?
FB выдаёт такое: Violation of FOREIGN KEY constraint "". Violation of FOREIGN KEY constraint "INTEG_132" on table "LIGUMI". Foreign key references are present for the record.
-
> Violation of FOREIGN KEY constraint "INTEG_132" on table > "LIGUMI".
если бы не экономил нв буквах и писал
CREATE TABLE TEBLE_2( ID_T2 INTEGER NOT NULL, ID_T1 INTEGER CONSTRAINT FK_TABLE2_TABLE1 REFERENCES TABLE_1(ID_T1) ON DELETE CASCADE, T2_NAME VARCHAR(10), PRIMARY KEY(ID_T2));
тогда всесто "INTEG_132" и получил бы внятное FK_TABLE2_TABLE1
-
Пост [16] - ответа так и нет.
Автору: тебе уже все ответили, только кушай.
> ЮЮ © (28.02.08 10:34) [25]
-
ЮЮ © (28.02.08 10:34) [25] тогда всесто "INTEG_132" и получил бы внятное FK_TABLE2_TABLE1
я в курсе, но мне не это надо. мне надо програмно разобрать это сообщение об ошибке и пользователю преподнести в виде типа "Данный документ удалить невозможно, т.к. он используется в строке №4 счёта №12/2008"
ЗЫ. что хотел, я уже узнал. Так что сделаю, как время появится.
-
> я в курсе, но мне не это надо. > мне надо програмно разобрать это сообщение об ошибке и пользователю > преподнести в виде > типа "Данный документ удалить невозможно, т.к. он используется > в строке №4 счёта №12/2008"
А сделать то же самое на клиенте до попытки удаления записи религия не позволяет? Нормальный клиент вообще должен дизайблить кнопку "Удалить" и енайблить кнопку "Связанные документы" на таких записях :)
-
ЮЮ © (29.02.08 4:28) [28] А сделать то же самое на клиенте до попытки удаления записи религия не позволяет?
зачем делать двойную работу?
> Нормальный клиент вообще должен дизайблить кнопку > "Удалить" и енайблить кнопку "Связанные документы" на > таких записях
спасибо за наведение на одну интересную мыслю :о)
-
Есть такой компонент TpFibErrorHandler в FIBPlus. Единственное, что мне оттуда пригодилось.
|