Конференция "Базы" » Можно ли определить таблицу и запись , которая не даёт удалить...
 
  • Prohodil Mimo © (08.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 (08.02.08 12:50) [1]
    Ну так, навскидку - перехватывать ошибку, лезть словарь и смотреть по какому полю Т5 ссылается на Т1. Ну и формировать свое сообщение.\

    ЗЫ. Вот не люблю мс скл, но у него самые понятные ошибки
  • Сергей М. © (08.02.08 12:51) [2]
    А каой тип объединения ты используешь ?
  • sniknik © (08.02.08 12:58) [3]
    REFERENCES это типа внешнего ключа в MSSQL? тогда оно должно определяться, в FB там все из системных таблиц привыкли получать...
    а в ADO к примеру есть общий механизм - схемы (т.е. если вдруг используеш его... неважно что FB/другое). тут уж от провайдера данных зависит поддерживает он их или нет.
  • Desdechado © (08.02.08 12:59) [4]
    > сообщения выводить своё, наподобие (Нельзя удалить эту запись
    > т.к. в таблице Т5 "содержимое поля T5_NAME" используется
    > запись из таблицы TEBLE_4
    А что, пользователи у тебя оперируют не понятиями предметной области, а понятиями БД? Нафига им знать об именах таблиц, об их взаимосвязях и полях?
  • Сергей М. © (08.02.08 13:03) [5]

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


    Сообщить пользователю, что, мол, нельзя удалить такой-то элемент такого-то справочника, поскольку на него ссылаются такие-то элементы таких-то документов - это еще куда ни шло, но за каким лешим пользователю знать всю внутреннюю кухню твоей базы ?
  • ANB (08.02.08 13:04) [6]

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

    Это уже шаг 2. Но он потребует ведения минимальных метаданных на русском языке.
  • Desdechado © (08.02.08 13:26) [7]
    > потребует ведения минимальных метаданных на русском языке.
    Не вижу необходимости. Документ (или что угодно) может состоять хоть из полусотни таблиц. Но для юзера это единое целое. Ему до фени, как оно хранится.
  • Sergey13 © (08.02.08 13:45) [8]
    > [0] Prohodil Mimo ©   (08.02.08 12:38)
    > Возможно ли получить какие-то данные именно при получении
    > сообщения об ошибке или в случае отказа сервера удалить
    > запись, вручную перебирать таблицы и записи и проверять,
    > кто же не даёт удалить?

    Так это смотря чего тебе хочется - универсальную проверялку ошибок или обработку конкретного случая. Естественно для первого варианта придется системный таблицы анализировать, во втором проще опросить уже известные таблицы.
    Но самое простое и правильное, ИМХО, не конкретизировать в данном случае ошибку. Иначе например если "мешается" не одна запись, а 100 или даже 1000000 (да еще и в разных таблицах!) - что, выводить их список что ли? Тут надо думать про логику работы в целом, что бы "автоматом" не получать таких обломов.
  • Prohodil Mimo © (08.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.
  • Сергей М. © (08.02.08 15:01) [10]

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


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


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

    А если я буду удалять через ХП, не легче будет? или там мне будут доступны те же данные, что и на клиенте?
  • megabyte © (08.02.08 16:08) [12]

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

    Хм, по-моему у него самые ниочемнеговорящие сообщения об ошибках аля "Incorrect syntax near ..." Ну это так, имхо!
  • MsGuns © (08.02.08 16:17) [13]
    ИМХО, тут явно тот случай, когда изменения (в т.ч. удаления и вставки) в таблицы надо реализовать через хранимки или триггеры - тогда вся логика будет описана в одном месте - на сервере.
  • Anatoly Podgoretsky © (08.02.08 16:25) [14]
    > megabyte  (08.02.2008 16:08:12)  [12]

    А ты что знаешь другие методы, когда синтаксис неверен?
  • ANB (08.02.08 17:45) [15]

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

    При ошибках ДМЛ он понятно сообщается в какой таблице и что именно ему не нравится.
    В оракле, например, частенько не пишется ни имя таблицы ни имени поля, из за которого возникли проблемы.
    Просто выкидывается константа, которая соответствует коду ошибки.
  • Alien1769 © (08.02.08 20:52) [16]
    Автору:

    Покажи описание триггеров, будет все понятно
  • Alien1769 © (08.02.08 20:53) [17]
    на данный момент
  • ЮЮ © (12.02.08 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 (12.02.08 14:18) [19]

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

    Это еще не извращенная - хотя бы видно ИД и ФК. Эт ты АИС Налог не видел :)
 
Конференция "Базы" » Можно ли определить таблицу и запись , которая не даёт удалить...
Есть новые Нет новых   [134431   +15][b:0][p:0.001]