powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание Домена(Domain) програмно в FB1.5.
20 сообщений из 20, страница 1 из 1
Создание Домена(Domain) програмно в FB1.5.
    #32616144
VKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VKV
Гость
Кто знает, что и как записать в поле rdb$default_value системной таблицы rdb$fields в FB1.5, что бы работола вставка значения по умолчанию???

Проблема появилась следующим образом.
При создании домена визуально с помощью IBExpert он показывает простой скрипт. Если домен создан таким образом то всё работает, т.е. при вводе новой строки он подставляет значение по умолчанию.
Программно (Update), изменяю поля rdb$default_sorse и rdb$null_flag в системной таблице rdb$fields, эти поля изменялись в скрипте при визуальном изменении домена.

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

При изменении выше перечисленных полей, IBExpert показавыет все правельно, даже на вкладке DDL, но привставке новой строки значение по умолчанию не вставляется.

Конечно это проблему можно решить сгенерировав скрипт Alter Domain. Но Я не знаю как вывести текст на экран или в файл.
Т.е. мне нужна команда как в MSSQL2000 - "print".
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616193
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо лазить в системные таблицы

Нет не надо

В чем проблемы с CREATE DOMAIN ?

Необходимость в аналоге print не понята
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616230
VKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VKV
Гость
Повторю мне нужен аналог команды print (из MSSQL) в FB1.5.
Для чего этужно, нет времени расказывать.
Если в кратце для того чтобы сгенерировать около 2500 доменов не руками же это все создовать.
Или кто подскажет как это сделать в хранимой процедуре.
Суть кода см. ниже, на select не зацикливайтесь.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
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;
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616465
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VKVПовторю мне нужен аналог команды print (из MSSQL) в FB1.5.
Для чего этужно, нет времени расказывать.
Если в кратце для того чтобы сгенерировать около 2500 доменов не руками же это все создовать.
Или кто подскажет как это сделать в хранимой процедуре.
Нет времени рассказывать - не спрашивай. Или ты считаешь, что у кого-то есть время отвечать на чайниковские вопросы ?

По сути
1. Не зная сервер, лезешь в системные таблицы. На первый раз это чайничество. Ты в курсе - кто есть упорствующий чайник ? ;)
2. FB <> MSSQL, поэтому сначала нужно хотя бы почитать TFM
3. DDL в SPL запрещён
4. Сделай свой select, выбери его на клиента и выполни
5. На кой тебе 2500 доменов ? ;)))
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616494
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
генеришь скрипт в любом языке программирования, затем запускаешь его
с помощью isql.exe или чего-нить другого
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616555
VKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VKV
Гость
Если Я спрашивую значит это мне надо.
Если Вы незнаете как ответить или помочь, то лучше ничего не отвечайте.
И уж если этот вопросос чайниковский (на русском языке Я понимаю как "простой"), на верняка на него можно былобы ответить легко.
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616575
VKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VKV
Гость
vis. Да таким образом я создаю БД c помощью MSSQL2000 для FB1.5.
Но я не могу сгенерить скрипт Alter Domain для полей, которым имя Домена FB присваивает сам, т.к. я не могу узнать эти имена.
А как сгенирить скрипт в FB Я не знаю, не могу найти аналог команды print (MSSQL) , если он есть.
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616667
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VKVЕсли Я спрашивую значит это мне надо.Значит читай ответы
VKVЕсли Вы незнаете как ответить или помочь, то лучше ничего не отвечайте.Я ответил тебе, в ответе есть всё
VKVИ уж если этот вопросос чайниковский (на русском языке Я понимаю как "простой"), на верняка на него можно былобы ответить легко.Ещё раз - в моём ответе есть полное решение твоей "проблемы", даже больше.

VKVА как сгенирить скрипт в FB Я не знаю, не могу найти аналог команды print (MSSQL) , если он есть.Если ты в MSSQL генеришь скрипты исключительно с помощью print, то ты и там чайник ;)))

PS чайник - не оскорбление, а вот ламер - это уже хуже, но я тебя так не называл... ;)
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616676
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladЕсли ты в MSSQL генеришь скрипты исключительно с помощью print, то ты и там чайник ;)))
Эх, Влад, разве ты не знаешь, что с MS SQL чайники не работают?...
Чайники юзают всякий АцтОй несерьёзный, типа IB.
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616697
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийЭх, Влад, разве ты не знаешь, что с MS SQL чайники не работают?...
Чайники юзают всякий АцтОй несерьёзный, типа IB.
;)))
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616711
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VKVЯ не знаю как вывести текст на экран или в файл

http://rfunc.sourceforge.net/rus/rfunc.htm
файловые функции в конце
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32616804
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Но я не могу сгенерить скрипт Alter Domain для полей, которым имя Домена FB присваивает сам, т.к. я не могу узнать эти имена


Если ФБ присваивал сам, то это системные домены. Их не трогай !
Так же, как и системные таблицы. О чём многократно уже сказали. И Не только на этом сайте...
:)
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617044
VKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VKV
Гость
Если комуто интересно, то предлагаю решение этой проблемы, точнее насчет изменения домена спомощью update и поля rdb$default_value системной таблицы rdb$fields.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
 --Создаю эти домены для того что бы получить значение поля rdb$default_value
 
Create Domain INTEG as Integer default  0 ;
Create Domain VARCH as varchar( 60 ) default '''';
Create Domain TIMEST as TimeStamp default 'DEFAULT '1. 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 в ХП.

После запуска этой процедуры все домены изменились нужным образом.
После этого при вводе новых записей в таблицу значения по умолчанию стали вставлятся как эсли бы домен был создан обычным образом.
Конечно код может не совсем оптимален, но мне неохото что улучшать.
Может существую и другие способы расказывайте.
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617084
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответь.

НАХРЕНА?
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617085
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VKVЕсли комуто интересно, то предлагаю решение этой проблемы, точнее насчет изменения домена спомощью update и поля rdb$default_value системной таблицы rdb$fields.
...
После запуска этой процедуры все домены изменились нужным образом.
После этого при вводе новых записей в таблицу значения по умолчанию стали вставлятся как эсли бы домен был создан обычным образом.
Конечно код может не совсем оптимален, но мне неохото что улучшать.
Может существую и другие способы расказывайте.

еретикЪ...
мы уж лучче по старинке, ручками, без системных таблиц...
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617131
VKV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VKV
Гость
Это пригодится если вы на основе данных в таблице создаете БД.
Содержащую около 400 таблиц, такое же количество триггеров и генераторов, окло 9000 индексов, первичных и внешних ключей.
Приходится править дофига имен таблиц, полей, ключей и т.д.
И все это дело переносится с парадокса на FB. Решайте сами, Я считаю лучше один раз помучится изучить, а потом спокойно этим пользоватся.
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617136
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем же базу создавать процедурой? можно же программку на перле написать...
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617141
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VKVЭто пригодится если вы на основе данных в таблице создаете БД.
Содержащую около 400 таблиц, такое же количество триггеров и генераторов, окло 9000 индексов, первичных и внешних ключей.
Приходится править дофига имен таблиц, полей, ключей и т.д.
И все это дело переносится с парадокса на FB. Решайте сами, Я считаю лучше один раз помучится изучить , а потом спокойноэтим пользоватся.
Изучить бы, не мешало бы таки...
А базы, народ проектирует обычно в CASE'ах...
А лазить в системные таблицы (не имея должных знаний и опыта) чревато ...
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617206
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VKVЭто пригодится если вы на основе данных в таблице создаете БД.А чего при создании БД не задать сразу все дефолты ?

VKVСодержащую около 400 таблиц, такое же количество триггеров и генераторов, окло 9000 индексов, первичных и внешних ключей.Ой, напугал ;)))

VKVПриходится править дофига имен таблиц, полей, ключей и т.д.
И все это дело переносится с парадокса на FB.Какие триггеры на парадоксе ?

VKVЯ считаю лучше один раз помучится изучить, а потом спокойно этим пользоватся.Вот об этом тебе все тут и говорят ;)
...
Рейтинг: 0 / 0
Создание Домена(Domain) програмно в FB1.5.
    #32617210
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нипонил...
ну пусть он лазает так вот запросто в системные таблицы, это его личное дело, но:
Код: plaintext
1.
2.
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'''
вот это вот нормально???
может кинуть ссылку про типы данных???
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание Домена(Domain) програмно в FB1.5.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]