Форум: "Базы";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизНе срабатывают 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c