Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проверка в триггере на not null [D7, IB6.x]


Zlod3y ©   (2005-01-08 00:49:00) 

есть таблица

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 всё-таки появлялся на экране?


Desdechado   (2005-01-21 11:54:00) [1]

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


Zlod3y   (2005-01-21 11:49:00) [2]

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


Desdechado   (2005-01-21 11:41:00) [3]

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


Zlod3y   (2005-01-21 11:29:00) [4]

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


Desdechado   (2005-01-21 10:58:00) [5]

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


Zlod3y   (2005-01-21 00:47:00) [6]

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


jack128   (2005-01-08 02:46:00) [7]

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


GanibalLector   (2005-01-08 01:49:00) [8]

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

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


Zlod3y   (2005-01-08 01:31:00) [9]

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


Zlod3y   (2005-01-08 01:26:00) [10]

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


jack128   (2005-01-08 01:15:00) [11]

Версия 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:00) [12]

ps fb1.5


Наверх

Титульная страница Поиск, карта сайта Написать письмо