Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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

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


pastor   (2008-03-04 10:08:00) [1]

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


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

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


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


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

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


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

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


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


Prohodil Mimo   (2008-02-28 15:21:00) [4]

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


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

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


Alien1769   (2008-02-28 12:10:00) [5]

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

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

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


ЮЮ   (2008-02-28 10:34:00) [6]

> 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_TABLE1REFERENCES TABLE_1(ID_T1) ON DELETE CASCADE,
T2_NAME VARCHAR(10),
PRIMARY KEY(ID_T2));

тогда всесто   "INTEG_132"и получил бы внятное   FK_TABLE2_TABLE1


Prohodil Mimo   (2008-02-27 22:57:00) [7]

ЮЮ ©   (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-26 03:02:00) [8]

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


При попытке удалить 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-25 14:06:00) [9]

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


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

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


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

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

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


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

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

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


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


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

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


ЮЮ   (2008-02-12 12:07:00) [13]

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


Alien1769   (2008-02-08 20:53:00) [14]

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


Alien1769   (2008-02-08 20:52:00) [15]

Автору:

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


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


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

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


Anatoly Podgoretsky   (2008-02-08 16:25:00) [17]

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

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


MsGuns   (2008-02-08 16:17:00) [18]

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


megabyte   (2008-02-08 16:08:00) [19]


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

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


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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо