Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Создание Домена(Domain) програмно в FB1.5.   Найти похожие ветки 

 
VadimKV   (2004-07-21 17:13) [0]

Кто знает, что и как записать в поле rdb$default_value системной таблицы rdb$fields в FB1.5, что бы работола вставка значения по умолчанию???

Проблема появилась следующим образом.
При создании домена визуально с помощью IBExpert он показывает простой скрипт. Если домен создан таким образом то всё работает, т.е. при вводе новой строки он подставляет значение по умолчанию.
Если создать домен программно темже скриптом, то значение поуполчанию не подставляется.
При сравнеивание системной таблицы выяснелось, что при визуальном создании он записывает чтото в поле rdb$default_value системной таблицы rdb$fields, при создании программно туда ничего не записывается.
Если кто знает как решить проблему подскажите.


 
Соловьев ©   (2004-07-21 17:16) [1]

скрипт в студию - и код программы


 
VadimKV   (2004-07-22 09:25) [2]

Если создать домен программно темже скриптом, то значение поумолчанию не подставляется.
При сравнеивание системной таблицы выяснелось, что при визуальном создании он записывает чтото в поле rdb$default_value системной таблицы rdb$fields, при создании программно туда ничего не записывается.

Ошибка, неверно я сказал. Программно (Update), изменяю поля rdb$default_sorse и rdb$null_flag в системной таблице rdb$fields.
А поле rdb$default_value оставляю без изменения, хотя если изменить с помощью Alter все нормально.
При изменении выше перечисленных полей, IBExpert показавыет все правельно, даже на вкладке DDL, но привставке новой строки значение по умолчанию не вставляется.
Конечно это проблему можно решить сгенерировав скрипт Alter Domain. Но Я не знаю как вывести текст на экран или в файл.
Т.е. мне нужна команда как в MSSQL2000 - "print".


 
Johnmen ©   (2004-07-22 09:30) [3]

>VadimKV

Если ты взял на себя ответственность лезть (грязными ручками ? :)) в системные таблицы, то
1. будь готов к чудесам
2. не спрашивай, как это делают другие


 
VadimKV   (2004-07-22 09:40) [4]

Насчет команды print, которая есть в MSSQL2000, аналог в FB1.5 есть или нет?
Если ВЫ скажите нет, тогда как он генерит скрипт создания базы данных (Tools/ExtractMetadata).


 
Johnmen ©   (2004-07-22 09:52) [5]

>Но Я не знаю как вывести текст на экран или в файл.

Какой текст ? О чём ?


 
VadimKV   (2004-07-22 10:01) [6]

В MSSQL2000 спомощью команды "print" сгенерировать любой текст, в Query Analyzer вкладка Message.
Далее с помощью *.bat сгенерированный текст(скрипт) можно запустить для нужной БД.
Пример:
print "Create index" + @Name + ...

Если кто знает об аналогичной команде в FB1.5 подскажите жду ответа.


 
Johnmen ©   (2004-07-22 10:04) [7]

:)))
Прикольно... Любой текст. Типа "Нет такой "команды" в MSSQL"


 
VadimKV   (2004-07-22 10:25) [8]

Повторю мне нужен аналог команды print (из MSSQL) в FB1.5.
Для чего этужно, нет времени расказывать.
Если в кратце для того чтобы сгенерировать около 2500 доменов не руками же это все создовать.
Или кто подскажет как это сделать в хранимой процедуре.
Суть кода см. ниже, на select не зацикливайтесь.

SET NAMES WIN1251;

CONNECT "C:\MEGAPOL_IB.GDB" USER "SYSDBA" PASSWORD "masterkey";

create procedure DefVal_Null
as
declare variable Domain_F varchar(200);
declare variable DefVal varchar(200);
Begin

For select sys_f.rdb$field_name,
   case    lf.field_type
   when    "ALPHA"     then    ""
   when    "NUMBER"    then    0
   when    "MONEY"     then    0
   when    "SHORT"     then    0
   when    "LONG"      then    0
   when    "DATE"      then    "01.01.2004 00:00:00"
   when    "TIME"      then    "01.01.2004 00:00:00"
   when    "TIMESTAMP" then    "01.01.2004 00:00:00"
   when    "AUTOINCREMENT"    then    0
   else 0
   end DefVal
   from    list_fld lf,
           rdb$relation_fields sys, rdb$fields sys_f
where   sys.rdb$system_flag = 0
       and (
       lf.field_lookup is not null
       or lf.field_key = "*"
       or lf.field_name in
           (
           select distinct field_lookup from list_fld
           where field_lookup is not null
           )
       ) and
       (lf.name_table = sys.rdb$relation_name
       and lf.field_name = sys.rdb$field_name)
       and sys.rdb$field_source = sys_f.rdb$field_name
       and substr(sys.rdb$field_source,1,4) <> "DMN_"
Into :Domain_F, :DefVal
As Cursor TmpCursor
Do
begin

   Update  rdb$fields f
   Set f.rdb$null_flag = 1
       --f.rdb$default_source = :DefVal
   where   Current Of  TmpCursor;

--**********На alter выдается ошибка неизвестный токен
--Без Alter все работает. Эту команду попробавал вставить т.к.
--при изменении полей rdb$null_flag и rdb$default_source вставка значения
--по умолчанию не срабатывает.
   alter domain :Domain_F set default :DefVal;
end

End;

execute procedure DefVal_Null;


 
Соловьев ©   (2004-07-22 10:36) [9]

Изачем это все?


 
Johnmen ©   (2004-07-22 10:37) [10]

Ещё раз
1. [3]
2. [7]
А также
3. Изменение метаданных в ХП недопустимо.


 
VadimKV   (2004-07-22 14:54) [11]

Если комуто интересно, то предлагаю решение этой проблемы, точнее насчет изменения домена спомощью update и поля rdb$default_value системной таблицы rdb$fields.

--Создаю эти домены для того что бы получить значение поля rdb$default_value
Create Domain INTEG as Integer default 0;
Create Domain VARCH as varchar(60) default """";
Create Domain TIMEST as TimeStamp default ""01.01.2004 00:00:00"";

SET NAMES WIN1251;

CONNECT "C:\MEGAPOL_IB.GDB" USER "SYSDBA" PASSWORD "masterkey";

create procedure DefVal_Null
as
declare variable Domain_F varchar(200);
declare variable DefVal varchar(200);
       --Переменная для поля типа BLOB
declare variable DefVal_BLOB blob sub_type 2 segment size 80;
Begin

For select sys_f.rdb$field_name,    --Имя Домена
   case    lf.field_type           --Присвоение значения по умолчанию
   when    "ALPHA"     then    "DEFAULT """""
   when    "NUMBER"    then    "DEFAULT 0"
   when    "MONEY"     then    "DEFAULT 0"
   when    "SHORT"     then    "DEFAULT 0"
   when    "LONG"      then    "DEFAULT 0"
   when    "DATE"      then    "DEFAULT ""01.01.2004 00:00:00"""
   when    "TIME"      then    "DEFAULT ""01.01.2004 00:00:00"""
   when    "TIMESTAMP" then    "DEFAULT ""01.01.2004 00:00:00"""
   when    "AUTOINCREMENT"    then    "DEFAULT 0"
   else null
   end DefVal,

--***********Этот Case для соответствующего значения по умолчанию,
--ставит значения для поля rdb$default_value******************
   case    lf.field_type       --Значение для поля BLOB
   when    "ALPHA"     then    (select rdb$default_value from rdb$fields where
                                       rdb$field_name = "VARCH")
   when    "NUMBER"    then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "INTEG")
   when    "MONEY"     then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "INTEG")
   when    "SHORT"     then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "INTEG")
   when    "LONG"      then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "INTEG")
   when    "DATE"      then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "TIMEST")
   when    "TIME"      then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "TIMEST")
   when    "TIMESTAMP" then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "TIMEST")
   when    "AUTOINCREMENT"
                       then    (select rdb$default_value from rdb$fields where
                                        rdb$field_name = "INTEG")
   else (select rdb$default_value from rdb$fields where rdb$field_name = "INTEG")
   end DefVal_BLOB

   from    list_fld lf,
           rdb$relation_fields sys, rdb$fields sys_f
where   sys.rdb$system_flag = 0
       and (
       lf.field_lookup is not null
       or lf.field_key = "*"
       or lf.field_name in
           (
           select distinct field_lookup from list_fld
           where field_lookup is not null
           )
       ) and
       (lf.name_table = sys.rdb$relation_name
       and lf.field_name = sys.rdb$field_name)
       and sys.rdb$field_source = sys_f.rdb$field_name
       and substr(sys.rdb$field_source,1,4) <> "DMN_"
Into :Domain_F, :DefVal, :DefVal_BLOB
As Cursor TmpCursor
Do
begin

--Тут все понятно изменяются три поля, а не два как показывается
--в скрипте при изменении домена
   Update  rdb$fields f
   Set f.rdb$default_value = :DefVal_BLOB,
       f.rdb$null_flag = 1,
       f.rdb$default_source = :DefVal
   where   Current Of  TmpCursor;
end

End;

execute procedure DefVal_Null;


Таким образом, если кто захочет изменить домен спомощью команды Update (для установки соответствующих ограничений Default и NotNull), то для этого необходимо изменить три поля в системной таблице rdb$null_flag, rdb$default_source и rdb$default_value системной таблицы rdb$fields.
Что записывать в первые два поля понятно.
Для того чтобы узнать, что нужно записывать в rdb$default_value Я поступил следующим образом.
1. Создал Домены с нужными значениями поупомалчанию.
2. Написал ХП в которой создаётся курсор с полями:
          Имя домена (Возможно и ненужно),
          Значение по умолчанию (для поля rdb$default_source)
          Значение (для поля rdb$default_value).
3. Ну и update в ХП.

После запуска этой процедуры все домены изменились нужным образом.
После этого при вводе новых записей в таблицу значения по умолчанию стали вставлятся как эсли бы домен был создан обычным образом.
Конечно код может не совсем оптимален, но мне неохото что улучшать.
Может существую и другие способы расказывайте.



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

Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.046 c
14-1090904819
DmitryS
2004-07-27 09:06
2004.08.15
Характерные неисправности ксероксов


9-1079704176
wiz
2004-03-19 16:49
2004.08.15
2D аркада на 3D движке (oGL). demo N1


3-1090304703
pashtet
2004-07-20 10:25
2004.08.15
как сделать что бы в базе в 18-00 происходило событие?


9-1083511587
Black Lord
2004-05-02 19:26
2004.08.15
Проблема с вращением сцены в OpenGL


1-1091413178
TotalMod
2004-08-02 06:19
2004.08.15
CopyRect, Canvas





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский