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

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

Не срабатывают DEFAUL значения


by ©   (2004-11-10 18:22:00) 

СУБД Firebird 1.5, IBExpert
Есть таблица
CREATE TABLE MT_USER (
   MT_USER_ID  T_REC_ID NOT NULL /* T_REC_ID = BIGINT DEFAULT 0 NOT NULL */,
   LOGIN_NAME  T_METADATA_NAME NOT NULL /* T_METADATA_NAME = VARCHAR(31) DEFAULT '' NOT NULL */,
   FAMILY      T_VARCHAR_32 NOT NULL /* T_VARCHAR_32 = VARCHAR(32) DEFAULT '' NOT NULL */,
   FIRST_NAME  T_VARCHAR_32 NOT NULL /* T_VARCHAR_32 = VARCHAR(32) DEFAULT '' NOT NULL */,
   SO_NAME     T_VARCHAR_32 NOT NULL /* T_VARCHAR_32 = VARCHAR(32) DEFAULT '' NOT NULL */,
   PATH_DOCS   T_VARCHAR_250 NOT NULL /* T_VARCHAR_250 = VARCHAR(250) DEFAULT '' NOT NULL */,
   MT_LANG_ID  T_REF_ID NOT NULL /* T_REF_ID = BIGINT DEFAULT 0 NOT NULL */,
   MT_MENU_ID  T_REF_ID NOT NULL /* T_REF_ID = BIGINT DEFAULT 0 NOT NULL */,
   FIO         COMPUTED BY (FAMILY||' '||FIRST_NAME||' '||SO_NAME)
);

Есть процедура
CREATE PROCEDURE MT_USER_I(
   MT_USER_ID BIGINT,
   LOGIN_NAME VARCHAR(31),
   FAMILY VARCHAR(32),
   FIRST_NAME VARCHAR(32),
   SO_NAME VARCHAR(32),
   PATH_DOCS VARCHAR(250),
   MT_LANG_ID BIGINT,
   MT_MENU_ID BIGINT)
AS
DECLARE VARIABLE TMP_ID BIGINT;
BEGIN
 INSERT INTO MT_USER (
   MT_USER_ID,
   LOGIN_NAME,
   FAMILY,
   FIRST_NAME,
   SO_NAME,
   PATH_DOCS,
   MT_LANG_ID,
   MT_MENU_ID)
 VALUES (
   :MT_USER_ID,
   :LOGIN_NAME,
   :FAMILY,
   :FIRST_NAME,
   :SO_NAME,
   :PATH_DOCS,
   :MT_LANG_ID,
   :MT_MENU_ID);
END

При выполнении такого запроса
insert into MT_USER (MT_USER_ID) VALUES (100)
все проходит нормально и запись добавляется, срабатывают все DEFAUL значения

Но при выполнении
EXECUTE PROCEDURE MT_USER_I(100, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
получается ошибка
The insert failed because a column definition includes validation constraints.
validation error for column LOGIN_NAME, value "*** null ***".
т.е. на первом поле которое не null должно быть.

Что я делаю не так, где глючу?


Reindeer Moss Eater   (2004-11-10 19:11:00) [1]

Логичнее написать триггер и в нем обрабатывать задуманную бизнес-логику.
Тем более, что default в конечном итоге - это тот же самый триггер


by   (2004-11-10 19:06:00) [2]

Понятно, спасибо.


Reindeer Moss Eater   (2004-11-10 19:06:00) [3]

Есть у меня поля с нулами.
И далеко не все поля у меня из приложения заполняются.


by   (2004-11-10 19:04:00) [4]

Понятно, позиция ясна.
А поля со значениями null у вас есть или вы все char заполняете "", а integer заполняете 0 из приложения?


Reindeer Moss Eater   (2004-11-10 19:03:00) [5]

Уточнение, фича о которой говорим - это default значения?

Она самая


Reindeer Moss Eater   (2004-11-10 19:03:00) [6]

А если иногда и использую, то в списке инсерта у меня никогда нет полей с дефолтами.


by   (2004-11-10 19:02:00) [7]

Уточнение, фича о которой говорим - это default значения?


Reindeer Moss Eater   (2004-11-10 19:01:00) [8]

Я эту малополезную при работе с БД из приложения фичу не использую.
Ибо она практически бесполезна.


by   (2004-11-10 18:58:00) [9]

Reindeer Moss Eater ©   (10.11.04 18:40)
а как вы используете подобную фичу - передаете все значения или осуществляете проверки в процедуре?


Reindeer Moss Eater   (2004-11-10 18:40:00) [10]

Какой вообще подход к написанию подобных SUID процедур?

Подход стандартный.
Применяя фичу, сначала про фичу читаем.


Reindeer Moss Eater   (2004-11-10 18:39:00) [11]

Получается, что надо внимательно читать документацию.

Некоторые, например, удивляются, что свойства классов с модификатором default в конструкторе не инициализируются указанными дефолтными значениями.


by   (2004-11-10 18:39:00) [12]

Какой вообще подход к написанию подобных SUID процедур? Дублируем проверки или оставляем все на проверку таблице?


by   (2004-11-10 18:38:00) [13]

проверять на null


by   (2004-11-10 18:37:00) [14]

[2] Reindeer Moss Eater ©   (10.11.04 18:33)
не увидел пока писал.

Тогда получается что процедуры на инсерт нужно писать сложнее, проверять и null все значения и дублировать default у себя в процедуре?


jack128   (2004-11-10 18:37:00) [15]

by ©   (10.11.04 18:35) [3]
Это стандартное поведение?

Да.


Reindeer Moss Eater   (2004-11-10 18:36:00) [16]

Это очень стандартное поведение.


by   (2004-11-10 18:35:00) [17]

вот такая конструкция тоже вызывает ту же ошибку
 INSERT INTO MT_USER (
   MT_USER_ID,
   LOGIN_NAME,
   FAMILY,
   FIRST_NAME,
   SO_NAME,
   PATH_DOCS,
   MT_LANG_ID,
   MT_MENU_ID)
 VALUES (
   100,
   null,
   null,
   null,
   null,
   null,
   null,
   null);

т.е. когда ничего не передаем, дефолты срабатывают, а когда передаем null, то нет.

Это стандартное поведение?


Reindeer Moss Eater   (2004-11-10 18:33:00) [18]

Дефолты срабатывают только тогда, когда поля с дефолтами не перечислены в списке инстерта.
Тогда вставляются дефолты.

Если поля перечислены в инсерте, то что пишется, то и слышится.


by   (2004-11-10 18:23:00) [19]

По идее при выполнении инсерта через процедуру дефолты тоже должны сработать


Наверх

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