|
Портирование DB2
|
|||
---|---|---|---|
#18+
Как здесь многолюдно :). На ответ сильно не расчитываю, но все таки. Сталкнулся с проблемой портирования DB2 v7.2. Нужно перенести базу с платформы Intel/W2k на Sparc/Sun. Попытка сделать это в лоб, через backup и restore провалилась, хотя в свое время для Informix это у меня проскочило за один день. Люди добрые, дайте совет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2002, 05:33 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
В доке написано что бэкапы платформозависимы. Пробуй IMPORT/EXPORT команды. С ними проблем быть не должно... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2002, 06:16 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
К сожелению процедуры экспорта - импорта тащат только данные. А есть еще процедуры, триггера. Backup в DB2 не может быть платформенно независимым принципиально. Так как хранимые процедуры в DB2 есть фактически не объект базы данных, а объект сервера, и соотвественно платформенно зависимы. Так на NT это dll'ки, а под UNIX это библиотека. Я нашел продукт DBARTSian, который этими вопросами занимается значительно лучше, чем средства DB2, но там тоже есть маленькие проблемы. В основном достает ошибка c кодом 3306N. Я за жто время уже стал, можно сказать специалистом по миграции DB2, правда очень маленьким :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2002, 06:36 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
Не вижу проблем - создай скрипт БД и все SP/Triggers готовы. А данные перетаскиваются IMPORT/EXPORT/LOAD Я конвертил с SQL Server to DB2 - вот это был процесс! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2002, 05:16 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
В версии 7.X есть Generate DDL - создает набор SQL предложений для создания таблиц, триггеров etc. Пробовал - понравилось, только ручками кое-что в скрипте пришлось менять, но это уже "производственные" нужды :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2002, 14:12 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
Gene: Увы, все не так просто. Скрипт с хранимой процедурой, выполнявшейся на одной платформе, может на другой не выполниться. Я на эти грабли наступил, при переносе с W2K на Solaris. W2K больше шалостей допускает. Кроме того, для создания части процедур, необходимо предварительно запустить некоторые из них. Ну вот так вот у нас сделанно. Понятно, что винить то особенно некого, как говорил Воробей из фильма Александр Невский - сам ковал, не бог дал. Но тем неменее ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2002, 03:35 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
Скрипт с хранимой процедурой, выполнявшейся на одной платформе, может на другой не выполниться. Я на эти грабли наступил, при переносе с W2K на Solaris. W2K больше шалостей допускает. Можно пример? как говорил Воробей из фильма Александр Невский Я русские фильмы уже лет 5 почти не смотрю. И жить легче, поверь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2002, 03:10 |
|
Портирование DB2
|
|||
---|---|---|---|
#18+
Gene: ну я и остальные тоже не смотрю. :) А насчет процедуры, пожалуйста: DROP SPECIFIC PROCEDURE KZK.SQL020319115706790 ~ CREATE PROCEDURE KZK.GET_AU_STRUCT (OUT P_RESULT INT) LANGUAGE SQL ------------------------------------------------------------------------ -- -- П.А0.01.20.001 Версия 2 от 11.02.2002 -- Набор состава ДСЕ -- ГСА -- последняя модификация 09.03.2002 -- ------------------------------------------------------------------------ P1: BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE L_LEVEL INTEGER DEFAULT 0; DECLARE L_RCOUNT INTEGER; -- Обработчик ошибок DECLARE EXIT HANDLER FOR SQLEXCEPTION SET P_RESULT = SQLCODE; DECLARE CONTINUE HANDLER FOR NOT FOUND SET P_RESULT = SQLCODE; -- По умолчанию все нормально SET P_RESULT = 0; -- Declare global temporary table -- Ошибки набора состава DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_STRUCT_ERR ( ID_STRUCT INTEGER, ID_AU INTEGER, LEVEL SMALLINT, ID_UNIT INTEGER, ID_PART INTEGER, ID_DEPT INTEGER, NROUTE SMALLINT, AMOUNT_UNIT DOUBLE, AMOUNT DOUBLE) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED; -- Набранный состав DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_STRUCT ( ID_STRUCT INTEGER, ID_AU INTEGER, LEVEL SMALLINT, ID_UNIT INTEGER, ID_PART INTEGER, FIRST_DEPT INTEGER, ID_DEPT INTEGER, LAST_NDEPT SMALLINT, NROUTE SMALLINT, AMOUNT_UNIT DOUBLE, AMOUNT DOUBLE) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED; -- Промежуточная таблица для набора состава DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_STRUCT_WORK ( ID_STRUCT INTEGER, LEVEL SMALLINT, ID_AU INTEGER, ID_UNIT INTEGER, ID_PART INTEGER, ID_SRC INTEGER, AUTHOR CHAR(1), NROUTE SMALLINT, FIRST_DEPT INTEGER, LAST_DEPT INTEGER, LAST_NDEPT SMALLINT, COUNT INTEGER, AMOUNT_UNIT DOUBLE, AMOUNT DOUBLE) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED; -- формирование свернутых маршрутов CALL KZK.CONVOLUTION_ROUTES(); -- Набираем состав INSERT INTO SESSION.TMP_STRUCT_WORK SELECT ROOT.ID AS ID_STRUCT, 0 AS LEVEL, ROOT.ID_AU, ROOT.ID_AU AS ID_UNIT, ROOT.ID_AU AS ID_PART, AU.ID_SRC, AU.AUTHOR, ROOT.NROUTE, RT.FIRST_DEPT, RT.LAST_DEPT, RT.LAST_NDEPT, RT.COUNT, 0, ROOT.AMOUNT FROM SESSION.TMP_FOR_STRUCT ROOT LEFT JOIN SESSION.FIRST_LAST_DEPT RT ON RT.ID_AU = ROOT.ID_AU AND RT.NROUTE = ROOT.NROUTE AND RT.LAST_DEPT = ROOT.ID_DEPT LEFT JOIN KZK.T_AU AU ON AU.ID = ROOT.ID_AU WHERE ((AU.AUTHOR <> 'Т' AND ROOT.FORTEH = 0) OR (ROOT.FORTEH <> 0)); -- Итерации по уровням вложенности при наборе состава изделия LEVEL_LOOP: REPEAT INSERT INTO SESSION.TMP_STRUCT_WORK SELECT PARENT.ID_STRUCT, PARENT.LEVEL + 1, PARENT.ID_AU, PARENT.ID_PART AS ID_UNIT, SPEC.ID_PART AS ID_PART, AU.ID_SRC, AU.AUTHOR, RT.NROUTE, RT.FIRST_DEPT, PARENT.FIRST_DEPT AS LAST_DEPT, RT.LAST_NDEPT, RT.COUNT, PARENT.AMOUNT, CASE WHEN ROOT.FORTEH = 1 THEN PARENT.AMOUNT * SPEC.AMOUNT_T ELSE PARENT.AMOUNT * SPEC.AMOUNT END AS AMOUNT FROM SESSION.TMP_STRUCT_WORK PARENT JOIN SESSION.TMP_FOR_STRUCT ROOT ON ROOT.ID = PARENT.ID_STRUCT JOIN KZK.T_SPEC SPEC ON SPEC.ID_UNIT = PARENT.ID_PART JOIN KZK.T_AU AU ON AU.ID = SPEC.ID_PART LEFT JOIN SESSION.FIRST_LAST_DEPT RT ON RT.ID_AU = SPEC.ID_PART AND RT.LAST_DEPT = PARENT.FIRST_DEPT WHERE -- Брем очередной слой PARENT.LEVEL = L_LEVEL -- Отслеживаем зданный уровнь вложенности AND PARENT.LEVEL < ROOT.LEVEL -- Ошибочные маршруты не разузловываем AND ((ROOT.NROUTE IS NULL) OR (PARENT.NROUTE > 0)) -- Коды принадлежности, которые не разузловываем (покупные) AND PARENT.ID_SRC NOT IN (SELECT ID_SRC FROM SESSION.TMP_SRC SR WHERE SR.ID_STRUCT = PARENT.ID_STRUCT) -- Берем ДСЕ только с заданным приоритетом AND SPEC.PRIORY = ROOT.PRIORY -- Технологический или конструкторский состав AND SPEC.FORTEH * ROOT.FORTEH = ROOT.FORTEH -- Коды классов ДСЕ, которые не учитывается (документация, покупные и т.д.) AND (AU.ID_CLS1 IS NULL OR (AU.ID_CLS1 NOT IN (SELECT ID_CLS1 FROM SESSION.TMP_CLS1 CL WHERE CL.ID_STRUCT = PARENT.ID_STRUCT))) -- Авторство для конструкторского состава AND ((AU.AUTHOR <> 'Т' AND ROOT.FORTEH = 0) OR (ROOT.FORTEH <> 0)) -- Принадлежность к заданному цеху (цех первый и единственный в маршруте) AND ((ROOT.ID_DEPT1 = PARENT.FIRST_DEPT AND (PARENT.LEVEL = 0 OR PARENT.COUNT = 1)) -- Если цех задан OR (ROOT.ID_DEPT1 IS NULL) -- Только для технологического состава с учетом маршрутов OR (ROOT.FORTEH = 0) OR (ROOT.NROUTE IS NULL)); -- посмотрим число обработанных в INSERT записей GET DIAGNOSTICS L_RCOUNT = ROW_COUNT; -- номер слоя для следующей итерации SET L_LEVEL = L_LEVEL + 1; -- условие выхода из цикла UNTIL L_RCOUNT = 0 END REPEAT LEVEL_LOOP; -- заполнение таблицы ошибок INSERT INTO SESSION.TMP_STRUCT_ERR SELECT ST.ID_STRUCT, ST.ID_AU, ST.LEVEL, ST.ID_UNIT, ST.ID_PART, ST.LAST_DEPT, ST.NROUTE, ST.AMOUNT_UNIT, ST.AMOUNT FROM SESSION.TMP_STRUCT_WORK ST JOIN SESSION.TMP_FOR_STRUCT ROOT ON ROOT.ID = ST.ID_STRUCT WHERE -- ошибка - превышен уровень вложенности - возможен цикл ST.LEVEL = ROOT.LEVEL -- ошибки маршрутов OR ((ROOT.NROUTE IS NOT NULL) AND (ST.NROUTE IS NULL)) -- в спецификации не задана входимость OR ST.AMOUNT IS NULL; -- формируем результат INSERT INTO SESSION.TMP_STRUCT SELECT ST.ID_STRUCT, ST.ID_AU, ST.LEVEL, ST.ID_UNIT, ST.ID_PART, ST.FIRST_DEPT, ST.LAST_DEPT, ST.LAST_NDEPT, ST.NROUTE, ST.AMOUNT_UNIT, ST.AMOUNT FROM SESSION.TMP_STRUCT_WORK ST JOIN SESSION.TMP_FOR_STRUCT ROOT ON ROOT.ID = ST.ID_STRUCT WHERE -- кроме ошибoк маршрутов (ROOT.NROUTE IS NULL OR ST.NROUTE IS NOT NULL) -- кроме неизвестной потребности AND ST.AMOUNT IS NOT NULL; IF P_RESULT = 100 THEN SET P_RESULT = 0; END IF; END P1 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2002, 03:55 |
|
|
start [/forum/topic.php?fid=43&tid=1606678]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 245ms |
total: | 368ms |
0 / 0 |