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

Вниз

Как перехватить занесение в базу записи, содержащей Null-значения   Найти похожие ветки 

 
b_baranov   (2002-12-04 02:34) [0]

Как перехватить занесение в базу записи, содержащей в некоторых полях, например "Фамилия", нежелательные Null-значения?
DELPHI и FIBPlus.
Alexandr подсказал: "Создай триггер, задай поле NOT NULL, задай CHECK в базе ...".

Создал исключение
CREATE EXCEPTION EX_NON_NULL "Не введены обязательные параметры"

Триггер BEFORE INSERT
BEGIN
INSERT INTO CART_PASPORT(ID) VALUES(CART_MAIN.PAT_ID); /* */
/* Попытка перехвата */
WHEN ANY DO
EXCEPTION EX_NON_NULL;
END

Запустил проц. В поле "Фамилия" ничего не ввел, чтобы инициировать исключение. Получил вполне переводимое:
F_1.pFIBDataSEt1.InsertQurry:
The insert failed because a column definition includes validation constraints.
validation errors for column LAST_N, value "*** null ***"

Что-то не то вытворяю. И толком прочитать негде. Извиняюсь за многословие, но опыта пока нет. Если можно, пожалуйста помогите.


 
DarkGreen   (2002-12-04 06:08) [1]

Ну а что ты хотел получить? Если хочешь просто перехватить, то создавай триггер на инсер, а если не хочешь позволить вообще делать этого (добавлять пустые (NULL) значения), то создавай CHECK. А у тебя судя по всему CHECK и сработал


 
Alexandr   (2002-12-04 06:27) [2]

вот вот.
1) Документацию для кого писали?
2) см. документацию и кучу всего на www.ibase.ru
3) Посмотри книжки, наконец.

иначе консультации будут платные, однозначно.


 
b_baranov   (2002-12-04 11:33) [3]

>DarkGreen Надеялся получить не стандартное сообщение, а окно, где как-то отражалось бы сообщение из созданного исключения


 
b_baranov   (2002-12-04 11:36) [4]

>Alexandr Книгу "Мир InterBase" не выпускаю из рук, но явно такого там не нахожу. А в документации без опыта непонятн куда смотреть.


 
Alexandr   (2002-12-04 11:40) [5]

т.е. у тебя и check not null сделан и триггер?


 
FreeLancer   (2002-12-04 11:43) [6]

Убери NOT NULL и CHECK для поля, оставь триггер, где проверяй на NULL. Иначе до триггера дело не дойдет. Предыдущие ограничения раньше такие попытки отсекут и выдадут свои Exception"ы. Создай свой Exception с "русским" содержимым или обрабатывай имеющийся:

try
...
except on E: Exception do
begin
if MessageBox(Application.Handle, PChar(E.Message+#10#13+"Это описание ошибки"), PChar(String(E.ClassName)+"Это название ошибки"),
MB_YESNO+MB_SYSTEMMODAL+MB_DEFBUTTON2) = mrYes then
begin
...
end else
begin
...
end;
if E.ClassType = EAccessViolation then ...
if E.ClassType = EDBEngineError then ...
end;
end;


 
FreeLancer   (2002-12-04 11:47) [7]

P.S. Взгляни на это:
http://www.ibase.ru/devinfo/customex.htm


 
b_baranov   (2002-12-04 11:50) [8]

>Alexandr Да и Check и триггер.


 
asafr   (2002-12-04 11:53) [9]

А что, в СУБД IB нет возможности для поля таблицы выставить NOT NUL?


 
Alexandr   (2002-12-04 11:58) [10]

а триггер который ты привел к какой таблице относится?
Да и вообще, привел бы тут описание таблицы с чеками и триггерами.
А то ты по-моему какой-то не тот триггер тут написал.
Вообщем, непонятно чего там у тебя в базе.
а вообще-то обычно так делают:
Вот хочешь ты проверить поле при вставке в таблицу на not null
так создай триггер на эту таблицу на before insert где
напищи
if new.field is null then exception EX_NON_NULL
и делов-то!


 
Alexandr   (2002-12-04 12:02) [11]

все там есть


 
b_baranov   (2002-12-05 02:48) [12]

>Alexandr "Да и вообще, привел бы тут описание таблицы с чеками и триггерами."

К вопросу о перехвате записи, содержащей недопустимые NULL-поля.

Рассматривается картотека (модель). Б.д. - две таблицы.
Табл. CART_MAIN - поля "PAT_ID", "ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО".
Табл. CART_PASPORT - поля "PAT_ID", "СЕРИЯ ПАСП", "НОМЕР ПАСП", "КОГДА ВЫД", "КЕМ ВЫД".

DELPHI-форма для полей табл. CART_MAIN.
Значение поля "PAT_ID" - из генератора.
Значения полей "ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО" - элементы ввода (DBEdit) - они-то и должны быть NOT NULL.
Триггер before insert для табл CART_MAIN - занося строку в эту табл. одновременно формируем строку для
этого пациента в табл. CART_PASPORT заполняя поле "PAT_ID".
Пациент регистрируется, т.е. строка заносится в табл. CART_MAIN, если значения полей
"ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО" NOT NULL (обязательные поля регистрации).

CREATE TABLE CART_MAIN (
PAT_ID INTEGER NOT NULL,
LAST_N VARCHAR (20) character set WIN1251 collate WIN1251,
FIRST_N VARCHAR (20) character set WIN1251 collate WIN1251,
SECOND_N VARCHAR (20) character set WIN1251 collate WIN1251)

CREATE TABLE CART_PASPORT (
PAT_ID INTEGER NOT NULL,
PASP_SER VARCHAR (20) character set WIN1251 collate WIN1251,
PASP_NUM VARCHAR (20) character set WIN1251 collate WIN1251,
PASP_VID VARCHAR (80) character set WIN1251 collate WIN1251,
PASP_DATE DATE);

CREATE EXCEPTION EX_NON_NULL "ОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ РЕГИСТРАЦИИ НЕ ВВЕДЕНЫ"

Trigger input_pat_id
AS
BEGIN
if ((cart_main.last_n is null) or (cart_main.first_n is null) or (cart_main.second_n is null)) then
exception ex_non_null;
else
insert into cart_pasport (id) values(cart_main.pat_id); /* Паспорт */
END

Вот, собственно, пока и все.
FreeLancer, Alexandr, большое спасибо за помощь.

Сознаю, что вас очевидно раздражает когда кто-то, как я, например, не понимает, что вначале срабатывает NOT NULL
(который у меня был заведен для полей "ФАМИЛИЯ", "ИМЯ", "ОТЧЕСТВО") со своим EXCEPTION и до триггера дело и не доходит, но вот поверьте в книгах "Мир IB" и "Delphi5. Руководство разработчика баз данных" Фаронов В.В., Шумаков П.В. явно об этом не написано. А по документации без опыта пока трудно. Это не в оправдание, а просто к слову.


 
Alexandr   (2002-12-05 06:04) [13]

1) откуда ты выдрал такое левое написание триггера?
2) В триггерах надо использовать new.field или old.field
3) Невнимательно читаешь сообщения в этой ветке
4) где в таблице card_passport поле ID
( с какого перепугу у тебя этот запрос пройдет вообще?) insert into cart_pasport (id) values(cart_main.pat_id);
5) Вообщем, достало меня дальше смотреть на этот бред. Иди снова книжки читай до ПОЛОНОГО прояснения.



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

Форум: "Базы";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.041 c
14-74929
AndreyAGSoft
2002-12-02 14:39
2002.12.23
Включусь в разработку


3-74591
ioSan
2002-12-05 01:00
2002.12.23
Помогите написать запрос без вложенного подзапроса.


4-75042
Cosmic
2002-11-09 19:00
2002.12.23
Как поменять скринсейвер?


14-74899
hedgehoge
2002-12-04 12:41
2002.12.23
Перекомпилить


1-74786
Кирилл
2002-12-11 11:49
2002.12.23
В чем разница между размером компонента в инспекторе ...





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