Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.12;
Скачать: 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 вся ветка

Текущий архив: 2002.08.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
4-35513
ATLANTIDO
2002-06-03 16:13
2002.08.12
свернуть окно


1-35291
Aleksandr
2002-07-29 14:06
2002.08.12
Можно ли трассировать в Делфи


3-35170
1g0r
2002-07-22 17:46
2002.08.12
Базы *.dbf


1-35283
Fast
2002-07-31 15:15
2002.08.12
Все просто


1-35317
SemFLY
2002-07-24 01:17
2002.08.12
Заполнение текстового документа из программы...