Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Вниз

Можно ли определить таблицу и запись , которая не даёт удалить...   Найти похожие ветки 

 
Prohodil Mimo ©   (2008-02-08 12:38) [0]

база - 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 и т.д.)
Возможно ли получить какие-то данные именно при получении сообщения об ошибке или в случае отказа сервера удалить запись, вручную перебирать таблицы и записи и проверять, кто же не даёт удалить?

Пример сильно упрощённый.


 
ANB   (2008-02-08 12:50) [1]

Ну так, навскидку - перехватывать ошибку, лезть словарь и смотреть по какому полю Т5 ссылается на Т1. Ну и формировать свое сообщение.\

ЗЫ. Вот не люблю мс скл, но у него самые понятные ошибки


 
Сергей М. ©   (2008-02-08 12:51) [2]

А каой тип объединения ты используешь ?


 
sniknik ©   (2008-02-08 12:58) [3]

REFERENCES это типа внешнего ключа в MSSQL? тогда оно должно определяться, в FB там все из системных таблиц привыкли получать...
а в ADO к примеру есть общий механизм - схемы (т.е. если вдруг используеш его... неважно что FB/другое). тут уж от провайдера данных зависит поддерживает он их или нет.


 
Desdechado ©   (2008-02-08 12:59) [4]

> сообщения выводить своё, наподобие (Нельзя удалить эту запись
> т.к. в таблице Т5 "содержимое поля T5_NAME" используется
> запись из таблицы TEBLE_4
А что, пользователи у тебя оперируют не понятиями предметной области, а понятиями БД? Нафига им знать об именах таблиц, об их взаимосвязях и полях?


 
Сергей М. ©   (2008-02-08 13:03) [5]


> Нельзя удалить эту запись т.к. в таблице Т5 "содержимое
> поля T5_NAME" используется запись из таблицы TEBLE_4 и т.
> д


Сообщить пользователю, что, мол, нельзя удалить такой-то элемент такого-то справочника, поскольку на него ссылаются такие-то элементы таких-то документов - это еще куда ни шло, но за каким лешим пользователю знать всю внутреннюю кухню твоей базы ?


 
ANB   (2008-02-08 13:04) [6]


> А что, пользователи у тебя оперируют не понятиями предметной
> области, а понятиями БД? Нафига им знать об именах таблиц,
>  об их взаимосвязях и полях?

Это уже шаг 2. Но он потребует ведения минимальных метаданных на русском языке.


 
Desdechado ©   (2008-02-08 13:26) [7]

> потребует ведения минимальных метаданных на русском языке.
Не вижу необходимости. Документ (или что угодно) может состоять хоть из полусотни таблиц. Но для юзера это единое целое. Ему до фени, как оно хранится.


 
Sergey13 ©   (2008-02-08 13:45) [8]

> [0] Prohodil Mimo ©   (08.02.08 12:38)
> Возможно ли получить какие-то данные именно при получении
> сообщения об ошибке или в случае отказа сервера удалить
> запись, вручную перебирать таблицы и записи и проверять,
> кто же не даёт удалить?

Так это смотря чего тебе хочется - универсальную проверялку ошибок или обработку конкретного случая. Естественно для первого варианта придется системный таблицы анализировать, во втором проще опросить уже известные таблицы.
Но самое простое и правильное, ИМХО, не конкретизировать в данном случае ошибку. Иначе например если "мешается" не одна запись, а 100 или даже 1000000 (да еще и в разных таблицах!) - что, выводить их список что ли? Тут надо думать про логику работы в целом, что бы "автоматом" не получать таких обломов.


 
Prohodil Mimo ©   (2008-02-08 14:50) [9]

Сергей М. ©   (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.


 
Сергей М. ©   (2008-02-08 15:01) [10]


> хочу указать имена документов и т.п.


А где и как у тебя определены соответствия "Документ (или справочник) -> ТакаяТоТаблица (или группа таких-то таблиц)" ?


 
Prohodil Mimo ©   (2008-02-08 16:00) [11]

Сергей М. ©   (08.02.08 15:01) [10]
А где и как у тебя определены соответствия "Документ (или справочник) -> ТакаяТоТаблица (или группа таких-то таблиц)" ?


Это уже другое. Как вывести человеческим языком - для меня не проблема.
У меня в данном случае проблема получить имя таблицы, которая держит запись, сам ИД записи, а так же имя таблицы в которой эта запись находится. И проблема не в том, что я не знаю ни одного способа, а в том, что мне этот способ не нравится, т.к. он аналог перебора вручную.

А если я буду удалять через ХП, не легче будет? или там мне будут доступны те же данные, что и на клиенте?


 
megabyte ©   (2008-02-08 16:08) [12]


> ЗЫ. Вот не люблю мс скл, но у него самые понятные ошибки

Хм, по-моему у него самые ниочемнеговорящие сообщения об ошибках аля "Incorrect syntax near ..." Ну это так, имхо!


 
MsGuns ©   (2008-02-08 16:17) [13]

ИМХО, тут явно тот случай, когда изменения (в т.ч. удаления и вставки) в таблицы надо реализовать через хранимки или триггеры - тогда вся логика будет описана в одном месте - на сервере.


 
Anatoly Podgoretsky ©   (2008-02-08 16:25) [14]

> megabyte  (08.02.2008 16:08:12)  [12]

А ты что знаешь другие методы, когда синтаксис неверен?


 
ANB   (2008-02-08 17:45) [15]


> megabyte ©   (08.02.08 16:08) [12]

При ошибках ДМЛ он понятно сообщается в какой таблице и что именно ему не нравится.
В оракле, например, частенько не пишется ни имя таблицы ни имени поля, из за которого возникли проблемы.
Просто выкидывается константа, которая соответствует коду ошибки.


 
Alien1769 ©   (2008-02-08 20:52) [16]

Автору:

Покажи описание триггеров, будет все понятно


 
Alien1769 ©   (2008-02-08 20:53) [17]

на данный момент


 
ЮЮ ©   (2008-02-12 12:07) [18]

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.Ы. Откуда такая извращенная фантазия при наименовании таблиц и полей?


 
ANB   (2008-02-12 14:18) [19]


> P.Ы. Откуда такая извращенная фантазия при наименовании
> таблиц и полей?

Это еще не извращенная - хотя бы видно ИД и ФК. Эт ты АИС Налог не видел :)


 
Anatoly Podgoretsky ©   (2008-02-12 20:57) [20]

> ЮЮ  (12.02.2008 12:07:18)  [18]

Немец, айн, цвай, драй, полицай, то есть пожизненый цик с гвоздями.
Но авторы это могут красиво обосновывать.


 
Сергей М. ©   (2008-02-14 09:23) [21]

http://www.codenet.ru/db/interbase/sysib.php

читать гл. "Ограничения" до полного просветления)


 
Prohodil Mimo ©   (2008-02-25 14:06) [22]

ЮЮ ©   (12.02.08 12:07) [18]
P.Ы. Откуда такая извращенная фантазия при наименовании таблиц и полей?


это просто пример, что бы понятнее и нагляднее было и было видно ИД и ФК.
Или надо было кусок реальной базы запостить?

Сергей М. ©   (14.02.08 9:23) [21]
спасибо, но вопрос был не об этом. Как это всё получить я и так знаю, я просто искал более простой путь, а вернее хотел узнать, нельзя ли получить именно то место, о которое запнулся сервер. Он то его уже и так нашёл, мог бы и поделиться координатами, вместо простого сообщения, что запнулся. А так я получил отказ и начинаю сам продклывать тот же путь для выяснения где это произошло. А хотклось бы без такого.


 
ЮЮ ©   (2008-02-26 03:02) [23]

> Он то его уже и так нашёл, мог бы и поделиться координатами


При попытке удалить 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, выполнение которого привело к ошибке?


 
Prohodil Mimo ©   (2008-02-27 22:57) [24]

ЮЮ ©   (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.


 
ЮЮ ©   (2008-02-28 10:34) [25]

> 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


 
Alien1769 ©   (2008-02-28 12:10) [26]

Пост [16] - ответа так и нет.

Автору:
тебе уже все ответили, только кушай.

> ЮЮ ©   (28.02.08 10:34) [25]


 
Prohodil Mimo ©   (2008-02-28 15:21) [27]

ЮЮ ©   (28.02.08 10:34) [25]
тогда всесто  "INTEG_132" и получил бы внятное  FK_TABLE2_TABLE1


я в курсе, но мне не это надо.
мне надо програмно разобрать это сообщение об ошибке и пользователю преподнести в виде
типа "Данный документ удалить невозможно, т.к. он используется в строке №4 счёта №12/2008"

ЗЫ. что хотел, я уже узнал. Так что сделаю, как время появится.


 
ЮЮ ©   (2008-02-29 04:28) [28]

> я в курсе, но мне не это надо.
> мне надо програмно разобрать это сообщение об ошибке и пользователю
> преподнести в виде
> типа "Данный документ удалить невозможно, т.к. он используется
> в строке №4 счёта №12/2008"


А сделать то же самое на клиенте до попытки удаления записи религия не позволяет?
Нормальный клиент вообще должен дизайблить кнопку "Удалить" и енайблить кнопку "Связанные документы" на таких записях :)


 
Prohodil Mimo ©   (2008-02-29 12:36) [29]

ЮЮ ©   (29.02.08 4:28) [28]
А сделать то же самое на клиенте до попытки удаления записи религия не позволяет?


зачем делать двойную работу?


> Нормальный клиент вообще должен дизайблить кнопку
> "Удалить" и енайблить кнопку "Связанные документы" на
> таких записях

спасибо за наведение на одну интересную мыслю :о)


 
pastor ©   (2008-03-04 10:08) [30]

Есть такой компонент TpFibErrorHandler в FIBPlus.
Единственное, что мне оттуда пригодилось.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.009 c
4-1194929446
balepa
2007-11-13 07:50
2008.08.31
CE_FRAME


2-1216799564
textExpanser
2008-07-23 11:52
2008.08.31
Простая независимая база данных (типа таблицы) для записи в файл


2-1216889323
Коля-Коля
2008-07-24 12:48
2008.08.31
Зависание


6-1192552967
Matrex
2007-10-16 20:42
2008.08.31
Проверка существования URL


2-1216973773
Vlad Oshin
2008-07-25 12:16
2008.08.31
почему выдает AV ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский