Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Не срабатывают DEFAUL значения   Найти похожие ветки 

 
by ©   (2004-11-10 18:22) [0]

СУБД 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 должно быть.

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


 
by ©   (2004-11-10 18:23) [1]

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


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

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

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


 
by ©   (2004-11-10 18:35) [3]

вот такая конструкция тоже вызывает ту же ошибку
 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:36) [4]

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


 
jack128 ©   (2004-11-10 18:37) [5]

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

Да.


 
by ©   (2004-11-10 18:37) [6]

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

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


 
by ©   (2004-11-10 18:38) [7]

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


 
by ©   (2004-11-10 18:39) [8]

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


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

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

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


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

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

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


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

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


 
Reindeer Moss Eater ©   (2004-11-10 19:01) [12]

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


 
by ©   (2004-11-10 19:02) [13]

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


 
Reindeer Moss Eater ©   (2004-11-10 19:03) [14]

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


 
Reindeer Moss Eater ©   (2004-11-10 19:03) [15]

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

Она самая


 
by ©   (2004-11-10 19:04) [16]

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


 
Reindeer Moss Eater ©   (2004-11-10 19:06) [17]

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


 
by ©   (2004-11-10 19:06) [18]

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


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

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



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

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
3-1100504182
wHammer
2004-11-15 10:36
2004.12.12
Возможно ли восстановление?


6-1096625251
leonidus
2004-10-01 14:07
2004.12.12
Интеграция программы с Оперой


1-1101731361
race1
2004-11-29 15:29
2004.12.12
tobject


1-1101579193
Sur
2004-11-27 21:13
2004.12.12
RT_MENU


3-1100111086
APXi
2004-11-10 21:24
2004.12.12
Как узнать ID созданной с помощью SQL записи?