Форум: "Базы";
Текущий архив: 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.036 c