|
|
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
Знающие люди, подскажите, мож кто видел стандартный алгоритм для этой задачи (нужно название и текстовое описание, не код). Необходимо создать табл. зависимости объектов для того чтобы генерить скрипт создания структуры БД в правильном порядке. Сам MS SQL Server делает это криво. Возникают ошибки типа: создается view 1, которое внутри себя вызывает view2, а view2 еще не создано - и досвидания. Скорее всего он должен выглядеть примерно так: 1. берем из сист. таблиц список объектов 2. берем первый объект в списке, присваиваю ему номер 1 3. берем второй объект, если второй зависит от первого, присваиваю ему номер 2, если наоборот, то ему номер 1, а первому - номер 2. 4. Берем третий объект, проверяем, если какой-то из уже рассмотренных объектов от него зависит - третиему присваиваем номер зависимого объекта, а звисимому - [его старый +1]. и.т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 08:03 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
Я бы делал так: 1) Берем все объекты, которые ни от кого не зависят, создаем их. Внутри порядок неважен. 2) Берем все объекты, которые зависят только от уже созданных объектов и создаем их. 3) Повторяем шаг 2 до тех пор, пока не кончатся объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 10:39 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
А что, на цикл нарваться разве нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 11:50 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
Добрый, день! Данный скрипт вернет список таблиц в порядке подчиненности (по 'FOREIGN KEY'). Надеюсь, что то подобное вы желали увидеть. DECLARE @Lev int SET @Lev = 1 /* Bce таблицы верхнего уровня */ SELECT @Lev AS LEV, TT.TABLE_NAME, CC.CONSTRAINT_NAME INTO #TmpTab FROM INFORMATION_SCHEMA.TABLES TT LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS CC ON CC.TABLE_NAME = TT.TABLE_NAME AND CC.CONSTRAINT_TYPE = 'PRIMARY KEY' WHERE TT.TABLE_TYPE = 'BASE TABLE' AND TT.TABLE_NAME NOT LIKE 'sys%' AND TT.TABLE_NAME NOT LIKE 'dtprop%' AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC WHERE TC.TABLE_NAME = TT.TABLE_NAME AND TC.CONSTRAINT_TYPE = 'FOREIGN KEY') WHILE @@ROWCOUNT > 0 AND @Lev < 99 BEGIN SET @Lev = @Lev + 1 /* Все таблицы которые имеют набор 'FOREIGN KEY', где они все ссылаются на ранее вставленые записи */ INSERT INTO #TmpTab(LEV, TABLE_NAME, CONSTRAINT_NAME) SELECT @Lev AS LEV, TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TT WHERE TT.CONSTRAINT_TYPE = 'PRIMARY KEY' AND TT.TABLE_NAME NOT LIKE 'sys%' AND TT.TABLE_NAME NOT LIKE 'dtprop%' AND TABLE_NAME NOT IN (SELECT TABLE_NAME FROM #TmpTab ) AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS LT INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC ON LT.CONSTRAINT_NAME = RC.CONSTRAINT_NAME AND NOT EXISTS (SELECT CONSTRAINT_NAME FROM #TmpTab TM WHERE RC.UNIQUE_CONSTRAINT_NAME = TM.CONSTRAINT_NAME) --UNIQUE_CONSTRAINT_NAME NOT IN (SELECT CONSTRAINT_NAME FROM #TmpTab ) WHERE TT.TABLE_NAME = LT.TABLE_NAME AND LT.CONSTRAINT_TYPE = 'FOREIGN KEY') END /* Таблицы попавшие в петлю или невошедшие в список по другим причинам */ INSERT INTO #TmpTab(LEV, TABLE_NAME, CONSTRAINT_NAME) SELECT 100, TT.TABLE_NAME, '' FROM INFORMATION_SCHEMA.TABLES TT WHERE TT.TABLE_TYPE = 'BASE TABLE' AND TT.TABLE_NAME NOT LIKE 'sys%' AND TT.TABLE_NAME NOT LIKE 'dtprop%' AND NOT EXISTS( SELECT 1 FROM #TmpTab WHERE TABLE_NAME = TT.TABLE_NAME) SELECT * FROM #TmpTab ORDER BY LEV, TABLE_NAME DROP TABLE #TmpTab ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 13:01 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
спасибо за ответы! по ключам - безусловно, но также бывают зависимости по view, функции истользуют значения из столбцов таблиц и пишут из в др. таблицы, процедуры вложенные бывают... а это как все обработать? если можно,мне в методике, теорией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 13:05 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
gardenmanА что, на цикл нарваться разве нельзя? еще как можно! допустим 3 объекта зациклены по связям. Принцип по которому я эту задачу решаю такой: сначала создаем все объекты (пустые), потом логику (формулы, значения по умолцанию и т.д.), потом все ключи и др. ограничения. тогда я думаю нужно в таблице зависимостей их просто попорядку рядом ставить. есть еще варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 13:11 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
Обычно, когда требуется перенести обновленную структуру, вьюхи, функции и хронимые процедуры на продакшен ДБ(после тестирования конечно), тогда выполняются шаги: 1) переношу модификации по таблицам, скрипт из предыдущего письма поможет разобраться с порядком модификаций таблиц. 2) запускаю скрипт по удалению вьюх, функциий и процедур, которые модифицированы или созданы в текущем задании (типа if exists … drop …) 3) запускаю скрипт по созданию вьюх, функциий и процедур, которые модифицированы или созданы в текущем задании (типа if not exists … create …) Шаг 3 запускается до успешного завершения без ошибок, обычно 2 - 4 итерации достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 13:33 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
А скрипты сами чем делаете, если не секрет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 13:59 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
NastyaGА скрипты сами чем делаете, если не секрет? когда люди используют PD, то он сам генерит. Я с ним работал до 9 версии. Он генерил криво, особенно что касалось переноса ХП. Сейчас не знаю как. Кстати, по внешние ключи ничего не сказали. Если о мигрировании идет речь, то мигрируют сначала таблицы, наполняют некоторые первичными данными. Потом первичные ключи, потом внешние ключи, потом констрэйнты. Потом начинается война с триггерами и ХП. Вот тут какраз можно нарваться на циклы. О тэйблспейсах, и самой базе, буферных пулах пока не говорим. Типа считаем что все уже есть. Типа вот так вот. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 14:27 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
PowerDesigner(ver 9.5 - 12.0) генерят все скрипты без проблем, ErWin - не хуже подходит для этих целей. Контекстное меню BD (Tasks\Generate Scripts) - также годится для сего, но менее удобен. Касательно пред-го письма, именно кратный запуск последнего шага должен целиком создать все зависимые обьекты за N проходов, где N - максимальный уровень зависимости обьектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 15:28 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
gardenmanА что, на цикл нарваться разве нельзя?Цикл чего? Если имеется ввиду циклическая связь между таблицами посредством FK, то это связь по ДАННЫМ, а не между объектами БД. Для циклической связи по FK дело будет обстоять так: 1) Создаем таблицы (они ни от кого не зависят) 2) Создаем FK - они зависят от таблиц. Цикличность в использовании друг друга может быть только в процедурах и пакетах. Но этот особый случай можно отработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 13:51 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
NastyaGно также бывают зависимости по view, функции истользуют значения из столбцов таблиц и пишут из в др. таблицы, процедуры вложенные бывают... а это как все обработать? если можно,мне в методике, теорией.Здесь есть несколько аспектов: 1) Как узнать кто от кого зависит... Если БД не предоставляет такой информации (от каких объектов БД зависит процедура или VIEW), то дело плохо... 2) Есть объекты БД, которые могут быть созданы, но иметь статус INVALID (по крайней мере в Oracle). Это процедуры, функции, пакеты. Соответственно, создавать их можно почти в любом порядке, но после создания их необходимо будет перекомпилировать. Здесь есть два подхода: [1] - стороить зависимость друг от друга (Oracle сам что-то похожее делает). [2] - Перекомпилировать все INVALID объекты в цикле до тех пор, пока таких не останется. Если в БД возможно состояние, что все пакеты и процедуры будут валидны, то рано или поздно это состояние достигнется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 14:02 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
gardenman[quot NastyaG]А скрипты сами чем делаете, если не секрет? когда люди используют PD, то он сам генерит. Я с ним работал до 9 версии. Он генерил криво, особенно что касалось переноса ХП. Сейчас не знаю как. quot] и PD? и сам SQL Server и как минимум 7 штук специализированного софта, которые мы тестировали - делают это криво! вот потому и пишем сами. Мы немного ушли от темы... есть еще вариатны как построить корректно таблицу зависимостей? учитвыая циклы и прчее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 12:01 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
Bely[quot NastyaG]1) Как узнать кто от кого зависит... Если БД не предоставляет такой информации (от каких объектов БД зависит процедура или VIEW), то дело плохо... есть в SQL Server системная таблица, там зависимости отражаются, но не дняч всех объектов корректно. Вьюхи точно не отслеживает вложенные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 12:07 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
NastyaG gardenman[quot NastyaG]А скрипты сами чем делаете, если не секрет? когда люди используют PD, то он сам генерит. Я с ним работал до 9 версии. Он генерил криво, особенно что касалось переноса ХП. Сейчас не знаю как. quot] и PD? и сам SQL Server и как минимум 7 штук специализированного софта, которые мы тестировали - делают это криво! вот потому и пишем сами. Мы немного ушли от темы... есть еще вариатны как построить корректно таблицу зависимостей? учитвыая циклы и прчее. Именно поэтому я PD и не использую. Сначала накуралесишь там, апотом он не может ничего создать в правильном порядке))) Получается много бестолковой работы. Проще делать готовые скрипты для накатки. А потом просто сравнивать пообъектно с эталонной БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 16:44 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
Не, мы свой софт делаем, и уже работает :) Я просто не уверена что оптимально эту самую таблицу зависимостей строим, пока вроде все отрабатывает, но не исключаю что возникнут ситуации, что прога отработает неверно. Ну и плюс мне надо алгоритм корректно описать в документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 07:29 |
|
||
|
Алгоритм построения таблицы зависимости объектов БД
|
|||
|---|---|---|---|
|
#18+
NastyaGне уверена что оптимально эту самую таблицу зависимостей строим Таблицу зависимостей строить не обязательно, проблема взаимозависимостей решается, например, таким образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Тогда алгоритм выглядит достаточно просто: 1. Создаем таблицы только со столбцами, без ключей и т.д. 2. Заполняем таблицы исходными данными 3. Создаем "заглушки" SP, UDF (CREATE PROCEDURE MyProc (...) AS RETURN) 4. Создаем "заглушки" VIEW (SELECT VIEW MyView (...) AS SELECT 0,'',...) 5. Создаем PK, FK, CHECK, INDEX'ы 6. Создаем триггеры 7. Делаем ALTER "полным" SP 8. Делаем ALTER "полным" VIEW 9. Прописываем права ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2008, 14:00 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35323067&tid=1543840]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 465ms |

| 0 / 0 |
