![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не срабатывают 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]По идее при выполнении инсерта через процедуру дефолты тоже должны сработать