powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / ErWin 4 + Oracle sequence
8 сообщений из 8, страница 1 из 1
ErWin 4 + Oracle sequence
    #33572977
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток всем !
Огромная просьба, подсказать новичку какое-нибудь ажурное решение. :)

Имеется evaluation версия CA ErWin одной из последних версий, пытаемся составить простейшую модель, цель изысканий получить схему для Oracle 10g. Для физической модели есть возможность добавить sequence, что вообщем удобно, но в прилагаемых доках не обнаружено, как можно менее затратно связать объект БД (конкретно, колонку таблицы) с данной последовательностью.

На официальном сайте CA есть об этом упоминание (http://supportconnectw.ca.com/public/enews/allfusion/af053105.asp), но там все запаролено. :( Не хотелось бы влоб писать триггеры. Может быть есть более красивые решения через макросы или какие-то специальные средства самого ErWin ?

Заранее спасибо за любого рода информацию ! :)
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33573421
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал так, в виде скрипта на таблицу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE SEQUENCE %TableName_SQ;

CREATE OR REPLACE TRIGGER %TableName_I_SQ
  BEFORE INSERT on %TableName
  for each row
BEGIN
  IF :NEW.%PK() IS NULL THEN
    SELECT %TableName_SQ.NEXTVAL INTO :NEW.%PK() FROM DUAL;
  END IF;
END;
/

Данный скрипт не работает с таблицами у котрых составной PK, но мне это и не надо.
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33576330
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2bas
Спасибо за ответ. :)

Я сделал немного по-другому, но пока не проверял создание на реальной Oracle БД (ввиду отсутствия оной) - прошу прощения, если где-то что-то попутал. В двух словах это выглядит так :

1) Добавил в physical model необходимые sequence.
2) Ввел для колонки UDP - допустим sequence_name, в данное поле для необходимых колонок я собираюсь вводить наименование закрепленной sequence или оставлять незаполненным.
3) Создал post script на уровне модели, в котором прописал следующий макрос :

%ForEachTable() {
%ForEachColumn() {
%If(%ColumnProp(sequence_name)) {

create or replase trigger tI_%TableName_SEQUENCE
before insert on %TableName
for each row
when (new.%ColName is null)
begin
select %ColumnProp(sequence_name).NEXTVAL
into :new.%ColName
from dual;
end;

}
}
}

Во время генерирования SQL в конце скрипта добавляются необходимые INSERT BEFORE триггеры. Единственное замечание, если данная колонка используется где-то в качестве FK, то UDP параметр с именем sequence копируется и в CHILD таблицу - необходимо очищать.
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33576451
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
%ColIsPK можно отсечь не первичные ключи. Чистить останется меньше.
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33576734
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prokhorov2) Ввел для колонки UDP - допустим sequence_name,
Это представляется мне лишней ручной работой. Полагаю, лучше ввести конвенцию типа "на таблицы с PK из одного поля генерируется sequence TABLENAME_SEQ и соответствующий триггер".

prokhorov3) Создал post script на уровне модели, в котором прописал следующий макрос
Хм. Насколько я помню ErWin, это означает, что при мелких изменениях таблицы - например переименовании колонки - скрипт не выполнится и база окажется с ошибкой. Хотя могу и ошибаться. Я делал этот скрипт на уровне таблицы.
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33579305
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 softwarer
Спасибо за уточнения ! :)

>Это представляется мне лишней ручной работой. Полагаю, лучше ввести
>конвенцию типа "на таблицы с PK из одного поля генерируется sequence
>TABLENAME_SEQ и соответствующий триггер".

Частично согласен с Вами : можно перенести UDP на уровень таблицы (просто не могу представить ситуации, где в одной таблице будут использоваться несколько последовательностей), но зацикливаться на наличии последовательности только в ключевом поле, да еще это поле единственное в ключе - мне кажется, лишнее. Разве sequence допустим только в PK ?

>Хм. Насколько я помню ErWin, это означает, что при мелких изменениях
>таблицы - например переименовании колонки - скрипт не выполнится и база
>окажется с ошибкой. Хотя могу и ошибаться. Я делал этот скрипт на уровне
>таблицы.

Не хотелось бы привязывать скрипты к конкретным таблицам - мне кажется, удобнее лишь заполнять UDP и давать самой системе дополнять нужные триггеры в нужное место. Хотя, конечно, при "точечном" исправлении модели - могут быть и накладки. Со ля ви ! :)

С учетом вышесказанного мое предложение модифицируется следующим образом :

1) Добавить в physical model необходимые sequence.
2) Ввести для таблицы UDP - 2 штуки : наименование последовательности(sequence_name) и наименование колонки, к чему "прикреплять" (sequence_column).
3) Создать post script на уровне модели, в котором прописать следующий макрос :

%ForEachTable() {
%If(%TableProp(sequence_name)) {

create or replace trigger tI_%TableName_SEQUENCE
before insert on %TableName
for each row
when (new.%TableProp(sequence_column) is null)
begin
select %TableProp(sequence_name).NEXTVAL
into :new.%TableProp(sequence_column)
from dual;
end;

}
}

Интересно каким образом сам CA (в вышеуказанном newsletter) рекомендует решать эту задачу ? Весь опыт работы с ErWin у меня больше связан, когда он еще был под Platinum - че та там таких сложностей с доками не припоминается. :)
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33579702
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prokhorovно зацикливаться на наличии последовательности только в ключевом поле, да еще это поле единственное в ключе - мне кажется, лишнее. Разве sequence допустим только в PK ?
В любом случае идти следует от задачи, которую Вы решаете. В принципе наличие нескольких сиквенсов для одной таблицы возможно - например, один для генерации id, другой - для генерации "номера документа". Более часто используемый случай - питание одним сиквенсом нескольких таблиц.

Но в любом случае, подлаживаться следует именно под задачу и под используемую технологию, максимизируя удобство. Я бы сказал, заполнение PK из сиквенса - это примерно 98% задач, и мне не очень нравится мысль в каждом из этих процентов делать что-то руками (прописывать название сиквенса в UDP). Лучше описать это поведение как дефолтовое, а при необходимости добавить возможность отключения дефолтового поведения и использовать ее в 2% случаев.

prokhorovНе хотелось бы привязывать скрипты к конкретным таблицам - мне кажется, удобнее лишь заполнять UDP и давать самой системе дополнять нужные триггеры в нужное место.
C одной стороны - да. С другой стороны - представьте себе, что ради каждого мелкого изменения Вам нужно перегенерить модель на пару тысяч таблиц.

prokhorovХотя, конечно, при "точечном" исправлении модели - могут быть и накладки. Со ля ви ! :)
Каждый вправе выбирать более симпатичный ему геморрой :)

prokhorov2) Ввести для таблицы UDP - 2 штуки : наименование последовательности(sequence_name) и наименование колонки, к чему "прикреплять" (sequence_column).
Хм. Такое впечатление, что Вам очень хочется день за днем делать одно и то же :) Впрочем, собственно, тоже вариант - по опыту эксплуатации такого подхода ощущите либо его преимущества, либо его недостатки.

Впрочем, чем больше Вы будете так вбивать, тем больше опечаток будете делать.

prokhorovcreate or replace trigger tI_%TableName_SEQUENCE
Я бы посоветовал использовать более короткое имя триггера. Досадное ограничение Oracle - 30-символьные идентификаторы. На моей базе этот триггер накрылся бы на

Код: 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.
SQL> select owner, count(*) from dba_tables where length(table_name)> 18  group by owner ;

OWNER                            COUNT(*)
------------------------------ ----------
CTXSYS                                   3 
ERUP_CLASSIFIER                          4 
MDSYS                                    5 
ODM                                     10 
ODM_MTR                                 12 
OE                                       4 
OLAPSYS                                 28 
ORDSYS                                   3 
OWB                                     15 
OWB_RT                                  51 
QS                                       5 
QS_CBADM                                 7 
QS_CS                                    6 
QS_ES                                   11 
QS_OS                                   11 
QS_WS                                   11 
SH                                       3 
SYS                                     52 
SYSTEM                                  48 
WH                                      14 
WKSYS                                    6 
WMSYS                                   12 
XDB                                      1 
...
Рейтинг: 0 / 0
ErWin 4 + Oracle sequence
    #33579982
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2softwarer

> В любом случае идти следует от задачи, которую Вы решаете. В принципе
> наличие нескольких сиквенсов для одной таблицы возможно - например,
> один для генерации id, другой - для генерации "номера документа". Более
> часто используемый случай - питание одним сиквенсом нескольких таблиц.

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

> Я бы посоветовал использовать более короткое имя триггера. Досадное
> ограничение Oracle - 30-символьные идентификаторы.

По поводу длины идентификаторов - это я совсем зарапортовался, сорри ... Спасибо, что поправили ! :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / ErWin 4 + Oracle sequence
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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