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

Проверка в триггере на not null   Найти похожие ветки 

← →
Zlod3y ©   (2005-01-08 00:49) [0]

есть таблица

create table printer
(
 kod_printer smallint not null primary key,
 naimenovanie varchar(15) not null unique
);


есть триггер на обновление данных

create trigger bu_printer for printer
active before update position 0
as
begin
 if (new.kod_printer is null) /*!!!это сравнение работает неадекватно, сначала вылазиет системное сообщение об ошибке, а cancel_upd_id вообще не вылазиет*/
   then exception cancel_upd_id;
   else if (upper(old.naimenovanie)<>upper(new.naimenovanie))
          then if (exists(select naimenovanie from memory where (upper(naimenovanie)=upper(new.naimenovanie))))
                 then exception dbl_msg;
end


почему не срабатывает такое сравнение должным образом и как мне добиться того чтобы cancel_upd_id всё-таки появлялся на экране?


← →
jack128 ©   (2005-01-08 01:15) [1]

Версия IB?? У меня все работает

/******************************************************************************/
/***          Generated by IBExpert 2004.09.09 08.01.2005 1:19:14           ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1251;

CREATE DATABASE "LOCALHOST:D:\Program Files\HK-Software\IB Expert 2.0\DB\TestDB.gdb"
USER "SYSDBA" PASSWORD "masterkey"
PAGE_SIZE 4096
DEFAULT CHARACTER SET WIN1251;

/******************************************************************************/
/***                                Domains                                 ***/
/******************************************************************************/

CREATE DOMAIN NEW_DOMAIN AS
INTEGER;

/******************************************************************************/
/***                               Exceptions                               ***/
/******************************************************************************/

CREATE EXCEPTION SAME_EXCEPTION "Exception";

/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/

CREATE TABLE NEW_TABLE (
   PK  INTEGER NOT NULL,
   I   INTEGER
);

/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE NEW_TABLE ADD CONSTRAINT PK_NEW_TABLE PRIMARY KEY (PK);

/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/

SET TERM ^ ;

/* Trigger: NEW_TABLE_BI0 */
CREATE TRIGGER NEW_TABLE_BI0 FOR NEW_TABLE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
 if (new.pk is null) then
   exception same_exception;
end
^

SET TERM ; ^


← →
jack128 ©   (2005-01-08 01:15) [2]

ps fb1.5


← →
Zlod3y ©   (2005-01-08 01:26) [3]

на BEFORE INSERT у меня тоже подобный триггер есть, и он работает отлично, но вот с BEFORE UPDATE это не проходит почему-то, хотя всё сделано почти также, как и у тебя в BEFORE INSERT


← →
Zlod3y ©   (2005-01-08 01:31) [4]

jack128 ©   (08.01.05 01:15) [2]
зы: не в клонах дело
а у меня вроде IB 6.0, точно не знаю и не знаю как узнать, ставил вместе с D7


← →
GanibalLector ©   (2005-01-08 01:49) [5]

>а у меня вроде IB 6.0, точно не знаю и не знаю как узнать, ставил вместе с D7

А если на панель управления посмотреть?


← →
jack128 ©   (2005-01-08 02:46) [6]

Ну и на апдейте тоже самое..  Все работает как надо..


← →
Zlod3y ©   (2005-01-21 00:47) [7]

>> jack128 ©   (08.01.05 02:46) [6]
а ты инсерт и апдейт делал в IBExpert или в своём приложении?
у меня в IBExpert"е тоже всё хорошо и красиво показывает, а в моём приложении по-другому. :-(


← →
Desdechado ©   (2005-01-21 10:58) [8]

странная немного логика - апдейтить первичный суррогатный ключ...
если уж так хочется проверку втулить, сделай так
if( new.kod_printer IS NULL ) then
 new.kod_printer=old.kod_printer;


← →
Zlod3y ©   (2005-01-21 11:29) [9]

ну я так и сделал сейчас, только сообщение всё-равно лезет


← →
Desdechado ©   (2005-01-21 11:41) [10]

1. в какой-то из версий IB проверка констраинтов шла раньше (глюк), чем срабатывали триггеры, так что версия важна
2. ты попробуй использовать свои компоненты так, чтобы поле kod_printer при апдейте было заполнено, неважно чем, все равно триггер отыграет. Похоже, ты через ClientDataSet пользуешь базу,так вот он обращает внимение на метаданные


← →
Zlod3y ©   (2005-01-21 11:49) [11]

я пользуюсь IBConsole для проверки нормальной работы триггеров.
посмотрел версию файла ibserver.exe
6.5.0.28


← →
Desdechado ©   (2005-01-21 11:54) [12]

3. или апдейти явно без указания поля kod_printer вместо использования внутреннего автоматического механизма апдейта, встроенного в компоненты



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

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



Память: 0.48 MB
Время: 0.023 c
3-1106549717
Alx2
2005-01-24 09:55
2005.02.20
Сортировка набора, возвращаемого хранимой процедурой


3-1106644487
Lucifer
2005-01-25 12:14
2005.02.20
Ошибка синтаксиса From


14-1106553402
Kerk
2005-01-24 10:56
2005.02.20
Я на грани самоубийства!!!


3-1106244179
KETT
2005-01-20 21:02
2005.02.20
сложная выборка в теле процедуры ib


14-1106747786
}|{yk
2005-01-26 16:56
2005.02.20
Требуется программист!




   Наверх