Вниз
Скачать: CL | DM;

Удаление записи в IB   Найти похожие ветки 

← →
AndbyOne ©   (2002-07-19 12:10) [0]

Уважаемые мастера подскажите как сделать удаление записи. проблема в следующем: надо для удаления использовать хранимую процедуру или триггер и если с этой записью есть связь хотя бы в одной из трёх таблиц, то не удалять эту запись, а в клиентском приложении соответственно информировать пользователя о невозможности удалить запись с указанием с какой таблицей есть связь.
Я так думаю для этого случая лучше использовать триггер и соответственно проверку написать не сложно, но как отменить удаление в триггере и отправить сообщение в приложение не знаю.


← →
AlexSam   (2002-07-19 12:19) [1]

Может я что-то не понял, но связь межде таблицами может быть по ключевым полям, а не записям, продумай это!


← →
Johnmen ©   (2002-07-19 12:31) [2]

Строишь Primary Key, Foreign Key, ссылочную целостность c ON DELETE CASCADE.
При попытке удалить будет возбуждена ошибка, которую и отлавливай.


← →
Fareader ©   (2002-07-19 12:31) [3]

Снегенерируй внутри триггера исключение и все отменится


← →
Desdechado ©   (2002-07-19 17:28) [4]

CREATE EXCEPTION N1 "нельзя!";

в триггере после проверки EXCEPTION N1;


← →
kaif ©   (2002-07-20 03:51) [5]

2 Johnmen © (19.07.02 12:31)
Жара, видно, сказывается...
При ON DELETE CASCADE как раз сообщения о невозможности удалить не будет. Вместо этого произойдет каскадное удаление.

Нужен foreign key без delete cascade. Можно с update cascade. А можно просто, если ключи стабильные.

В триггере проверку делать нельзя. Я сам этого не знал - мне подсказали недавно (Alexandr). Дело в том, что триггер работает в контексте транзакции. Это значит, что есть вероятность удаления записи при многопользовательском доступе. Правильно только foreign key.


← →
Desdechado ©   (2002-07-20 18:50) [6]

2 kaif
>Правильно только foreign key.
челу нужно указать, с какой таблицей есть связь. А foreign key выдаст только абстрактное ругательство о невозможности удаления.
кроме того, в данном случае вариант невозможности удаления главной записи по причине невидимости удаления зависимой записи из другой транзакции не страшен - всегда можно повторить попытку :)


← →
Fran   (2002-07-21 12:00) [7]

Чтобы юзер не испугался англ. слов пишешь
try
процедура удаления
except
ShowMessage("Не могу! Есть ссылка.");
end;


← →
kaif ©   (2002-07-21 14:34) [8]

2 Desdechado © (20.07.02 18:50)
Если чел хочет сделать вразумительное сообщение о том, какая именно ссылка мешает удалить строку, он может преспокойно в секции except On E: Exception do проверить класс ошибки, привести ошибку к классу ошибок сервера, выяснить природный номер ошибки InterBase и если это ошибка данного типа (нарушение внешнего ключа), просто выделить из текста ошибки имя этого ключа и даже если у него неименованные constraints, то сделав SQL запрос к rdb$relation_constraints он узнает имя таблицы, которой foreign key принадлежит и выдать осмысленное сообщение на русском языке с указанием русского эквивалента имени таблицы (для чего можно завести еще одну таблицу и хранить там эти русские эквиваленты, если не лень, конечно).


← →
Desdechado ©   (2002-07-22 11:00) [9]

2 kaif © (21.07.02 14:34)
способ хорош, но:
1. выяснить природный номер ошибки InterBase - заточка только на IB, что не всегда гуд
2. сделав SQL запрос к rdb$relation_constraints - дополнительный траффик по сети (min 6 кб), что тоже не всегда хорошо :)

вот чел почитает, и пусть решает, что ему лучше ;)


← →
kaif ©   (2002-07-22 13:52) [10]

2 Desdechado © (22.07.02 11:00)
Согласен.



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.009 c
1-35259
sel
2002-07-30 15:48
2002.08.12
Экспорт


1-35330
Владик_1
2002-07-29 17:56
2002.08.12
Как к гриду?


8-35389
Yaro
2002-04-04 17:53
2002.08.12
Быстрее ScanLine


1-35262
V.Turecky
2002-07-30 14:54
2002.08.12
Загрузка из DLL ICO файла...


1-35346
Арсентьев
2002-07-30 12:36
2002.08.12
изменить цвет




   Наверх