Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.036 c
1-1101746383
Df
2004-11-29 19:39
2004.12.12
if, then, else on RichEdit


14-1100831566
ИМХО
2004-11-19 05:32
2004.12.12
Роман с камнем, мелодия


14-1101231153
Kurtevich
2004-11-23 20:32
2004.12.12
Жалобы на Дельфи :(


1-1101533719
Baks
2004-11-27 08:35
2004.12.12
XPManifest


14-1101020589
Sour
2004-11-21 10:03
2004.12.12
SMTP и POP3 серверы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский