|
|
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
Доброе время суток всем ! Огромная просьба, подсказать новичку какое-нибудь ажурное решение. :) Имеется evaluation версия CA ErWin одной из последних версий, пытаемся составить простейшую модель, цель изысканий получить схему для Oracle 10g. Для физической модели есть возможность добавить sequence, что вообщем удобно, но в прилагаемых доках не обнаружено, как можно менее затратно связать объект БД (конкретно, колонку таблицы) с данной последовательностью. На официальном сайте CA есть об этом упоминание (http://supportconnectw.ca.com/public/enews/allfusion/af053105.asp), но там все запаролено. :( Не хотелось бы влоб писать триггеры. Может быть есть более красивые решения через макросы или какие-то специальные средства самого ErWin ? Заранее спасибо за любого рода информацию ! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2006, 11:25 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
Я сделал так, в виде скрипта на таблицу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Данный скрипт не работает с таблицами у котрых составной PK, но мне это и не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2006, 12:55 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
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 таблицу - необходимо очищать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 11:55 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
%ColIsPK можно отсечь не первичные ключи. Чистить останется меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 12:17 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
prokhorov2) Ввел для колонки UDP - допустим sequence_name, Это представляется мне лишней ручной работой. Полагаю, лучше ввести конвенцию типа "на таблицы с PK из одного поля генерируется sequence TABLENAME_SEQ и соответствующий триггер". prokhorov3) Создал post script на уровне модели, в котором прописал следующий макрос Хм. Насколько я помню ErWin, это означает, что при мелких изменениях таблицы - например переименовании колонки - скрипт не выполнится и база окажется с ошибкой. Хотя могу и ошибаться. Я делал этот скрипт на уровне таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 13:09 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
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 - че та там таких сложностей с доками не припоминается. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 11:15 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 12:46 |
|
||
|
ErWin 4 + Oracle sequence
|
|||
|---|---|---|---|
|
#18+
2softwarer > В любом случае идти следует от задачи, которую Вы решаете. В принципе > наличие нескольких сиквенсов для одной таблицы возможно - например, > один для генерации id, другой - для генерации "номера документа". Более > часто используемый случай - питание одним сиквенсом нескольких таблиц. Полностью согласен, что следует "плясать" от задачи - в конкретно моем случае, как раз ид создаются для ограниченного числа таблиц, поэтому "висящие" без дела UDP не смущают, а прописать, где нужны последовательности, нужно ограниченное число раз - с другой стороны более наглядно на мой взгляд. > Я бы посоветовал использовать более короткое имя триггера. Досадное > ограничение Oracle - 30-символьные идентификаторы. По поводу длины идентификаторов - это я совсем зарапортовался, сорри ... Спасибо, что поправили ! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 13:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33579702&tid=1545386]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
144ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 485ms |

| 0 / 0 |
