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

Вниз

Удаление записи в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-35347
Елена
2002-07-30 08:59
2002.08.12
Файлы ddp


3-35186
kaif
2002-07-23 11:54
2002.08.12
Как настроить среду?


8-35383
QueenOfRain
2002-04-04 10:41
2002.08.12
Как сделать невидимую форму?


3-35144
Devid
2002-07-20 20:41
2002.08.12
Простой да ужаса вопрос


1-35352
ilg
2002-07-30 13:25
2002.08.12
OnClick для компонента





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский