Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перестал работать триггер и значения по умолчанию 
:(
    Опции темы
Гость_Сергей
Дата 11.8.2005, 01:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











IB 7.5. Саму базу создаю с помощью IBExpert 2005.01.30. Приложение на Delphi через IB-компоненты.

Пока только один триггер со счетчиком на PK главной таблицы. Сначала все работало нормально. Но с какого-то момента (не уследил, с чего началось), в приложении стала возникать ошибка, что не заполнено поле PK.
При этом, если добавлять запись в Эксперте, то все работает на ура, т.е., заполняю неключевые поля и триггер сам заносит значение по счетчику.
Самое интересное, что попробовал добавить запись через консоль IB - появлялась та же ошибка. А еще, вдобавок, начал ругаться на незаполненность полей со значениями по умолчанию, но для которых установлено NOT NULL.

Чего это такое может быть?
  Вверх
AZDesign
Дата 11.8.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.6.2005

Репутация: нет
Всего: нет



А ты бы привел описание таблицы и триггера - можно было бы разобратся
PM MAIL   Вверх
Гость_Сергей
Дата 11.8.2005, 12:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Где-то так:
Код

/******************************************************************************/
/***               Generated by IBExpert 11.08.2005 13:30:56                ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1251;



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


CREATE GENERATOR GEN_CLIENTS_ID;

CREATE TABLE CLIENTS (
    CLIENT_ID         INTEGER NOT NULL,
    LNAME             VARCHAR(25) NOT NULL,
    FNAME             VARCHAR(25) NOT NULL,
    PNAME             VARCHAR(25) NOT NULL,
    GENDER            VARCHAR(1) NOT NULL,
    BORN              DATE NOT NULL,
    MPHONE            VARCHAR(20),
    HPHONE            VARCHAR(20),
    WPHONE            VARCHAR(20),
    FAX               VARCHAR(20),
    EMAIL             VARCHAR(50),
    CITY              VARCHAR(25),
    STREET            VARCHAR(28),
    HOUSE             VARCHAR(15),
    FLAT              VARCHAR(8),
    WORK_PLACE        VARCHAR(50),
    OCCUPATION        VARCHAR(80),
    POLIS_OMS         VARCHAR(70),
    POLIS_DMS         VARCHAR(70),
    MED_CHECKUP       VARCHAR(70),
    BLOOD_GR          VARCHAR(1) DEFAULT 0 NOT NULL,
    BLOOD_RH          VARCHAR(1) DEFAULT 0 NOT NULL,
    BLOOD_TRANS       VARCHAR(40),
    SURGICAL_OPS      VARCHAR(125),
    INFECTIONS        VARCHAR(125),
    HEPATITIS         VARCHAR(20),
    TUBERCULOSIS      VARCHAR(20),
    AIDS              VARCHAR(20),
    VENERAL           VARCHAR(20),
    DIABETES          VARCHAR(50),
    ALLERGY           VARCHAR(50),
    HAZARDS           VARCHAR(50),
    VACCINATIONS      VARCHAR(50),
    NOTES             VARCHAR(255),
    DIRECT_BY         VARCHAR(70),
    CREATE_DATE_TIME  TIMESTAMP,
    CREATED_BY        INTEGER
);




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

ALTER TABLE CLIENTS ADD CONSTRAINT PK_CLIENTS PRIMARY KEY (CLIENT_ID);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE CLIENTS ADD CONSTRAINT FK_CLIENTS_1 FOREIGN KEY (BLOOD_GR) REFERENCES BLOOD_GR (BL_GR_ID);
ALTER TABLE CLIENTS ADD CONSTRAINT FK_CLIENTS_2 FOREIGN KEY (BLOOD_RH) REFERENCES BLOOR_RH (BL_RH_ID);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX CLIENTS_NAME_IDX ON CLIENTS (LNAME, FNAME, PNAME);


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


SET TERM ^ ;




/* Trigger: CLIENTS_BI */
CREATE TRIGGER CLIENTS_BI FOR CLIENTS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.CLIENT_ID IS NULL) THEN
    NEW.CLIENT_ID = GEN_ID(GEN_CLIENTS_ID,1);
END
^


SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/


Еще есть таблица с FK, связанным с PK этой. Но я FK удалял, т.е. делал таблицы независимыми - ситуация ни сколько не поменялась.

Backup/Restore тоже погоды не сделали.


А каков там вообще механизм обработки событий в триггерах? Если у меня на поле check установлен и триггер с очередностью - 0. Check'у тоже по умолчанию нулевая очередность присваивается, и ее нельзя менять. Так если я запись добавляю, и не заношу значение в поле, то что произойдет сначала - сработает триггер, или выругается check? Или это от алфавитного порядка имен обоих зависит?
А то у меня была ситуация, когда такая вот совокупность оказалось неработоспособной. А затем - все сам-собой чудесным образом исправилось.

А теперь, похоже, вообще, значение поля сначала проверяется, а затем уже производится попытка задать умолчание (хотя, последнее проверить невозможно). Но под Экспертом все работает как и должно.
  Вверх
Гость_Сергей
Дата 11.8.2005, 13:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Все! Разобрался! smile

Это не IB ругается, а Delphi. Точнее, модуль IBTable. Когда в нем изначально поля создаются, то тем, у которых в БД установлен NOT NULL, флаг Requered по умолчанию устанавливается в True. Если же это поле не включать в список доступных через IBTable, или установить его Requered в False, то все начинает работать.
Еще, вместо Requered = False можно задать ReadOnly = True для этого поля. Тогда IBTable так же понимает, что требовать ввода данных бесполезно, и возлагает все проверки на IB.

А вот что консоли не нравится - не знаю. Но это уже не актуально smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0413 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.