База знаний | Глоссарий | Избранное | Логин
Сопровождение, настройка, проверка целостности БД Oracle Primavera P6

КРАТКАЯ ИНСТРУКЦИЯ ПО ОБСЛУЖИВАНИЮ БАЗ ДАННЫХ И ПРОВЕРКИ ЦЕЛОСТНОСТИ ДАНЫХ ПРОЕКТОВ ORACLE PRIMAVERA P6 8.X

 

Версия 0.1. 06.07.2015 DRAFT (информация предоставлена сайтами: PMTrain.ru, Oracle Primavera.ru)

                В Oracle Primavera P6, EPPM, PPM, реализованы две службы Background Jobs ((SYSMON (System Monitor), DAMON (Data Monitor)), запускаемые RDBMS Scheduler по расписанию или в зависимости от действий пользователя.

                Существуют 11 (одиннадцать) управляемых задач Background Jobs. Каждая представляет собой хранимую процедуру сервера БД.

I.                     SYSMON (System Monitor) отвечает за оперативные выполняемые задачи длящиеся несколько секунд, такие как:

a.        USESSION_CLEANUP_EXPIRED – очистка сессии пользователя, который был определённое время не активный

b.       OBSPROJ_PROCESS_QUEUE – отвечает за процесс изменения прав на EPS и Проекты

II.                    DAMON (Data Monitor) за отложенные во времени задачи очистки таблиц от старых записей, которые удалил пользователь

a.        BGPLOG_CLEANUP – очистка старых записей из таблицы Log службы Background Jobs.

b.       REFRDEL_CLEANUP – очистка старых записей из таблицы REFRDEL.

c.        CLEANUP_PRMQUEUE – очистка записей смены прав доступа к EPS и Проектам.

d.       USESSION_CLEAR_LOGICAL_DELETES – очистка всех записей пользователя после закрытия сессии или ее удалении

e.       CLEANUP_LOGICAL_DELETES – удаление записей, которые пользователь пометил как уделяемые. Primavera вначале помечает записи, не удаляя их физически.

f.         PRMAUDIT_CLEANUP – удаление старых записей аудита.

g.         CLEANUP_USESSAUD – удаление старых записей аудита для пользовательской сессии.

h.        USER_DEFINED_BACKGROUND – делает доступным изменения пользовательских

i.         CLEANUP_OLD_DATA –процедура очистки старой системной информации.

Настройки службы Background Jobs не являются оптимальными

Таблица REFRDEL

 

                В процессе функционирования Oracle Primavera P6, операции создания и удаления сущностей Oracle Primavera P6 и записывает эти действия в таблицу REFRDEL

Посмотреть количества записей таблицы можно с помощью SQL запроса:

 

SELECT count(*) FROM REFRDEL

 

                Наличие записей от 10-70 млн. говорит о значительном объеме информации, которая занимает физический объем БД и может влиять на общую производительность системы. Эти данные не требуются Oracle PrimaveraP6 для поддержки целостности данных БД и могут быть удалены.

                Существует два способа очистки данной таблицы:

1.       С помощью хранимой процедуры REFRDEL_CLEANU службы DAMON Background Job, который запускается по расписанию. Узнать расписание возможно, выполнив следующий запрос:

SELECT setting_value FROM settings WHERE namespace = 'database.background.Damon' AND setting_name = 'interval'

 

                Результат запроса, будет, скорее всего тот, который был по умолчанию. Один раз в неделю.

Setting_value

1W

 

                Это значит, что все девять хранимых процедур будут запускаться одновременно один раз в неделю. Что само по себе вызовет большую нагрузку на систему и не до конца очистит таблицу REFRDEL (при таких настройках удаляются только данные за один день, данные за оставшиеся 6 дней не будут удалены). Все настройки периодичности запуска хранимых процедур можно посмотреть в таблице SETTINGS.

Значение запуска службы DAMON Background Job один раз в неделю:

Таблица USESSAUD

                В таблице USESAUDIT храниться информация об аудите логинах пользователей. Со временем эта таблица может занимать миллионы строк.

                Очисткой таблицы USESAUDIT занимаются хранимые процедуры CLEANUP_USESSAUD и CLEANUP_PRMQUEUE. Интервал очистки также берется из таблицы SETTINGS. Механизм очистки, как и при работе с таблицей REFRDEL.

1.       Решение:  Добавление записей в таблицу SETTINGS с оптимальными параметрами для очистки таблиц

exec SETTINGS_WRITE_STRING '15m','database.background.Damon','Interval'

exec SETTINGS_WRITE_STRING 'SATURDAY','database.background.Damon','DayOfWeek'

 

exec settings_write_string '100','database.cleanup.Refrdel','DaysToDelete'

exec settings_write_string '15','database.cleanup.Refrdel','IntervalStep'

exec settings_write_string '8d','database.cleanup.Refrdel','KeepInterval'

 

exec settings_write_string '8d','database.cleanup.Usessaud','KeepInterval'

exec settings_write_bool '0','database.cleanup.Usessaud','DeleteAll'

exec settings_write_number '799999','database.cleanup.Usessaud','DeleteAllThreshold'

exec settings_write_number '100','database.cleanup.Usessaud','DeletePercentage'

exec settings_write_number '800000','database.cleanup.Usessaud','MaxRowsToDelete'

 

exec initialize_background_procs

 

How To Change The Interval Run Times For The Database Background Jobs - System Monitor (Symon) And Data Monitor (Damon) (Doc ID 908274.1)

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=538202345907519&id=908274.1&_afrWindowMode=0&_adf.ctrl-state=1dmsop1a8e_535

 

2.       Очистка таблиц REFRDEL и USESAUDIT с помощью команды T-SQL:

truncate table REFRDEL

truncate table USESAUDIT

 (F5 Refresh or Summarizing In P6 Client Performance is very slow (Doc ID 1615584.1) https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=449048034003307&id=1615584.1&_afrWindowMode=0&_adf.ctrl-state=g7bx5skw9_339)

! Рекомендуется выполнять в нерабочее время. Так  как данная операция приведет к общей нагрузке на дисковую систему и блокировке выше указанных таблиц

3.       Установка фильтра для отображения ресурсов только ресурсов открытого проекта, на каждом рабочем месте, где используется толстый клиент.

Добавить в registry: HKEY_LOCAL_MACHINE\Primavera\< новый ключ типа DWORD с названием ResourceSummaries со значением «0»>

(Refresh (F5) Operation Hangs At 'Loading Summary Data' And Opening Project(s) Hang At 98% Due To High Wait Event In P6 Optional Client (Doc ID 1369370.1)

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=449247206141626&parent=DOCUMENT&sourceId=1615584.1&id=1369370.1&_afrWindowMode=0&_adf.ctrl-state=g7bx5skw9_388

 

4.       Использовать для базы модель Snapshot Isolation

ALTER DATABASE <База Oracle Primavera>

SET ALLOW_SNAPSHOT_ISOLATION ON

 

ALTER DATABASE <База Oracle Primavera>

SET READ_COMMITTED_SNAPSHOT ON

 

Подробнее: http://msdn.microsoft.com/en-us/library/tcbchxcb%28v=vs.80%29.aspx

 

5.       Тюнинг индексов. При замедлении поиска и чтения информации.

Общие рекомендации http://msdn.microsoft.com/en-us/library/ms189858%28v=sql.90%29.aspx

 

a.       После определения фрагментации, если процент логической фрагментации (logical fragmentation) меньше чем 30% , рекомендуется использовать реорганизацию индекса (Index Reorganization) Подробнее: http://technet.microsoft.com/en-us/library/ms179349.aspx

b.       После определения фрагментации, если процент логической фрагментации (logical fragmentation), больше чем 30% , рекомендуется использовать пересоздание индекса (Index Rebuild)

Подробнее: http://technet.microsoft.com/en-us/library/ms187874.aspx

6.       Тюнинг статистики (Statistics on a SQL Database)

Использовать при возникновении следующих проблем:

                                                               i.      Медленная загрузка проектных данных в представления макетов

                                                              ii.      PM.exe не отвечает после ввода логина и пароля

                                                            iii.      Долго не загружается окно программы после ввода логина и пароля

 

UPDATE STATISTICS PROJECT WITH FULLSCAN ,ALL
UPDATE STATISTICS TASK WITH FULLSCAN ,ALL

 

EXEC SP_UPDATESTATS 

 

Для просмотра времени последнего обновления статистики использовать следующий запрос:

 

SELECT OBJECT_NAME(A.object_id) AS Object_Name, A.name AS index_name, STATS_DATE(A.OBJECT_ID, index_id) AS StatsUpdated ,
DATEDIFF(d,STATS_DATE(A.OBJECT_ID, index_id),getdate()) DaysOld
FROM sys.indexes A
INNER JOIN sys.tables B ON A.object_id = B.object_id
WHERE A.name IS NOT NULL
ORDER BY DATEDIFF(d,STATS_DATE(A.OBJECT_ID, index_id),getdate()) DESC

Подробней (MS SQL 2005): https://technet.microsoft.com/en-us/library/cc966419.aspx

Базовая информация по тюнингу: https://technet.microsoft.com/en-us/magazine/2008.08.database.aspx

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=535898457364718&id=1327603.1&_afrWindowMode=0&_adf.ctrl-state=1dmsop1a8e_4

 

ПРОВЕРКА ПРОЕКТОВ БАЗЫ ДАННЫХ ORACLE PRIMAVERA НА ЦЕЛОСТНОСТЬ

 

Проверка целостности проекта позволяет идентифицировать и ошибки и неконсинстентность  информации в проекте и базе данных Oracle Primavera P6.

*Данный тип проверок был в версиях Oracle Primavera 7.х. (толстый клиент), в версиях от 8.X (толстый клиент) данную опцию убрали

*Существует возможность в версии EPPM в тонком клиенте (только просмотр, без возможности коррекции) проверки базовых бизнес условий и логических ограничений проекта, результаты которых, могут показать и физические ошибки нарушений целостности данных.

Существуют два типа проверки:

I.                     Проверка связей (Data Join Integrity Check). Например: проектный календарь назначен на задачу в другом проекте

II.                    Проверка значений (Data Value Integrity Check). Например: незавершенная задача имеет фактическое значение кол-ва равное плановому.

 

                ДЛЯ ПРОВЕРКИ ЦЕЛОСТНОСТИ ПРОЕКТА:

1.       Откройте проект в Oracle Primavera P6, который вы хотите проверить

2.       Выключите в макете отображение связей (Link)

 

Скрипты T-SQL проверки целостности связей и значений (Data Join Integrity Check и Data Value Integrity Check)

* исключены проверки листов учета рабочего времени (Timesheet)

 

1.    ПРОВЕРКА ЗАДАЧ: ПОТЕРЯ ПРИВЯЗКИ ЗАДАЧ К WBS

Проверка:

SELECT TASK.wbs_id, TASK.proj_id, PROJWBS.proj_id FROM TASK,PROJWBS WHERE TASK.wbs_id=PROJWBS.wbs_id AND TASK.proj_id <> PROJWBS.proj_id

Коррекция:

update TASK set proj_id = (select proj_id from PROJWBS where wbs_id = TASK.wbs_id) where proj_id <> (select proj_id from PROJWBS where wbs_id = TASK.wbs_id)

2.    ПРОВЕРКА НАЗНАЧЕНИЯ РЕСУРСА: ПРОВЕРКА НАЗНАЧЕНИЯ РЕСУРСА НА ЗАДАЧУ

Проверка:

SELECT TASKRSRC.task_id, TASKRSRC.proj_id, TASK.proj_id FROM TASKRSRC,TASK WHERE TASKRSRC.task_id=TASK.task_id AND TASKRSRC.proj_id <> TASK.proj_id

Коррекция:

update TASKRSRC set proj_id = (select proj_id from TASK where task_id = TASKRSRC.task_id) where proj_id <> (select proj_id from TASK where task_id = TASKRSRC.task_id)

3.    ПРОВЕРКА НАЗНАЧЕНИЯ ДОКУМЕНТОВ НА WBS: ПОТЕРЯ В WBS, НАЗНАЧЕНИЯ  ДОКУМЕНТОВ И ЗАДАЧ

Проверка:

SELECT TASKDOC.task_id, TASKDOC.wbs_id, TASK.wbs_id FROM TASKDOC,TASK WHERE TASKDOC.task_id=TASK.task_id AND TASKDOC.wbs_id<>TASK.wbs_id

Коррекция:

Update TASKDOC set wbs_id = (select wbs_id from TASK where task_id = TASKDOC.task_id) where TASKDOC_ID in (SELECT TASKDOC_ID FROM TASKDOC,TASK WHERE TASKDOC.task_id=TASK.task_id AND TASKDOC.wbs_id<>TASK.wbs_id)

4. ПРОВЕРКА НАЗНАЧЕНИЯ ДОКУМЕНТОВ: ПРОЕКТ ПОТЕРЯЛ НАЗНАЧЕНИЯ ДОКУМЕНТОВ И WBS

Проверка:

SELECT TASKDOC.wbs_id, TASKDOC.proj_id, PROJWBS.proj_id FROM TASKDOC,PROJWBS WHERE TASKDOC.wbs_id=PROJWBS.wbs_id AND TASKDOC.proj_id<>PROJWBS.proj_i;

Коррекция:

Update TASKDOC set proj_id = (select proj_id from PROJWBS where wbs_id = TASKDOC.wbs_id) where proj_id <> (select proj_id from PROJWBS where wbs_id = TASKDOC.wbs_id)

5.    ПРОВЕРКА РАСХОДОВ:  ПРОЕКТ ПОТЕРЯЛ НАЗНАЧЕНИЕ РАСХОДОВ НА ЗАДАЧИ

Проверка:

SELECT PROJCOST.task_id, PROJCOST.proj_id, TASK.proj_id FROM PROJCOST,TASK WHERE PROJCOST.task_id=TASK.task_id AND PROJCOST.proj_id <> TASK.proj_id

Коррекция:

update PROJCOST set proj_id = (select proj_id from TASK where task_id = PROJCOST.task_id) where proj_id <> (select proj_id from TASK where task_id = PROJCOST.task_id)

6.    ПРОВЕРКА НАЗНАЧЕНИЯ СПРАВОЧНИКА ЗАДАЧ НА ЗАДАЧИ: ПРОЕКТ ПОТЕРЯЛ НАЗНАЧЕНИЕ СПРАВОЧНИКОВ ЗАДАЧИ НА ЗАДАЧИ

Проверка:

SELECT TASKACTV.task_id, TASKACTV.proj_id, TASK.proj_id FROM TASKACTV,TASK WHERE TASKACTV.task_id=TASK.task_id AND TASKACTV.proj_id <> TASK.proj_id

Коррекция:

update TASKACTV set proj_id = (select proj_id from TASK where task_id = TASKACTV.task_id) where proj_id <> (select proj_id from TASK where task_id = TASKACTV.task_id)

7.    ПРОВЕРКА НАЗНАЧЕНИЯ ЗАМЕТОК: ПРОЕКТ ПОТЕРЯЛ НАЗНАЧЕНИЕ ЗАМЕТОК НА ЗАДАЧИ

Проверка:

SELECT TASKMEMO.task_id, TASKMEMO.proj_id, TASK.proj_id FROM TASKMEMO,TASK WHERE TASKMEMO.task_id=TASK.task_id AND TASKMEMO.proj_id <> TASK.proj_id

Коррекция:

update TASKMEMO set proj_id = (select proj_id from TASK where task_id = TASKMEMO.task_id) where proj_id <> (select proj_id from TASK where task_id = TASKMEMO.task_id)

8.    ПРОВЕРКА ШАГОВ ЗАДАЧ: ПРОЕКТ ПОТЕРЯЛ ШАГИ ПО ЗАДАЧАМ

Проверка:

SELECT TASKPROC.task_id, TASKPROC.proj_id, TASK.proj_id FROM TASKPROC,TASK WHERE TASKPROC.task_id=TASK.task_id AND TASKPROC.proj_id <> TASK.proj_id

Коррекция:

Update TASKPROC set proj_id = (select proj_id from TASK where task.id = TASKPROC.task_id) where proj_id <> (select proj_id from TASK where task_id = TASKPROC.task_id)

9.    ПРОВЕРКА КОММУНИКАЦИЙ: ПРОЕКТ ПОТЕРЯЛ ИНФОРМАЦИЮ В ЗАКЛАДКЕ «КОММУНИКАЦИИ»  ПО  ЗАДАЧЕ

Проверка:

SELECT TASKFDBK.task_id, TASKFDBK.proj_id, TASK.proj_id FROM TASKFDBK,TASK WHERE TASKFDBK.task_id=TASK.task_id AND TASKFDBK.proj_id <> TASK.proj_id

Коррекция:

update TASKFDBK set proj_id = (select proj_id from TASK where task_id = TASKFDBK.task_id) where proj_id <> (select proj_id from TASK where task_id = TASKFDBK.task_id)

10. ПРОВЕРКА ЗАМЕТОК ДЛЯ РЕСУРСОВ: ПРОЕКТ ПОТЕРЯЛ ИНФОРМАЦИЮ О ЗАМЕТКАХ РЕСУРСА

Проверка:

SELECT TASKNOTE.task_id, TASKNOTE.proj_id, TASK.proj_id FROM TASKNOTE,TASK WHERE TASKNOTE.task_id=TASK.task_id AND TASKNOTE.proj_id <> TASK.proj_id

Коррекция:

Update TASKNOTE set proj_id = (select proj_id from TASK where task_id = TASKNOTE.task_id) where proj_id <> (select proj_id from TASK where task_id = TASKNOTE.task_id)

11.   ПРОВЕРКА СВЯЗЕЙ ЗАДАЧ: ПРОЕКТ ПОТЕРЯЛ СВЯЗИ МЕЖДУ ЗАДАЧАМИ

Проверка:

SELECT TASKPRED.task_id, TASKPRED.proj_id, TASK.proj_id FROM TASKPRED,TASK WHERE TASKPRED.task_id=TASK.task_id AND TASKPRED.proj_id <> TASK.proj_id

Коррекция:

Update taskpred set proj_id = (select proj_id from TASK where taskpred.task_id = task.task_id) where task_pred_id in (SELECT task_pred_id FROM TASKPRED,TASK WHERE TASKPRED.task_id=TASK.task_id AND TASKPRED.proj_id <> TASK.proj_id)

12.   ПРОВЕРКА СВЯЗЕЙ ЗАДАЧ: В ПРОЕКТЕ У ЗАДАЧ ПОСЛЕДОВАТЕЛИ ПОТЕРЯЛИ СВЯЗИ

Проверка:

SELECT taskpred.pred_proj_id, task.task_id, task.proj_id FROM taskpred, task WHERE taskpred.pred_task_id = task.task_id AND taskpred.pred_proj_id <> task.proj_id

Коррекция:

update taskpred set pred_proj_id = (select proj_id from task where taskpred.pred_task_id = task.task_id) where task_pred_id in (SELECT task_pred_id FROM taskpred, task WHERE taskpred.pred_task_id = task.task_id AND taskpred.pred_proj_id <> task.proj_id)

13.   ПРОВЕРКА ЗАДАЧ: В ПРОЕКТЕ КАЛЕНДАРИ ПОТЕРЯЛИ СВЯЗИ С ЗАДАЧАМИ

Проверка:

SELECT task.clndr_id, task.proj_id, calendar.clndr_id, calendar.proj_id FROM task, calendar WHERE task.clndr_id = calendar.clndr_id AND task.proj_id <> calendar.proj_id AND calendar.proj_id IS NOT NULL

Коррекция:

DECLARE @new_clndr_id INT, @x INT, @cal_id INT, @countT INT, @pproj_id INT, @countC INT, @y INT

 

DECLARE @tempTable TABLE (

sno   INT IDENTITY(1, 1),

task_proj_id INT,

task_id INT,

cal_id INT,

cal_proj_id INT)

 

DECLARE @prjTable TABLE(

sno   INT IDENTITY(1, 1),

proj_id INT)

 

IF Object_id('tempdb..#calTable') IS NOT NULL

BEGIN

    DROP TABLE #calTable

END

 

CREATE TABLE #calTable (

sno   INT IDENTITY(1, 1),

cal_id INT)

 

INSERT INTO @tempTable

SELECT t.proj_id, t.task_id, c.clndr_id, c.proj_id

FROM TASK t INNER JOIN calendar c

ON t.clndr_id = c.clndr_id

AND t.proj_id <> c.proj_id

AND c.proj_id IS NOT NULL

AND c.delete_session_id is NULL

AND t.delete_session_id is NULL

ORDER BY t.proj_id;

 

--Step 0 (put distinct prjs into temp table)

INSERT INTO @prjTable

SELECT DISTINCT ct.task_proj_id

FROM @tempTable ct

order by ct.task_proj_id;

 

SELECT @countT = MAX (sno)

FROM @prjTable

 

SET @x = 1

SET @y = 1

 

WHILE @x <= @countT

BEGIN

           

            SELECT @pproj_id = p.proj_id

            FROM @prjTable p

            WHERE p.sno = @x

           

            --Put distinct cal ids into tbl

            TRUNCATE TABLE #calTable

           

            INSERT INTO #calTable

            SELECT DISTINCT t1.cal_id

            FROM @tempTable t1

            WHERE T1.task_proj_id = @pproj_id

           

            SELECT @countC = MAX (sno)

            FROM #calTable

           

            IF @countC > 1

                                 BEGIN                            

                                                    

                                                     WHILE @y <= @countC

                                                     BEGIN

                                                                         SELECT @cal_id = c.cal_id

                                                                         FROM #calTable c

                                                                         WHERE c.sno = @y

                                                                        

                                                                         --STEP 1 (create new cal C3 from C1 and give it to P2)

                                                                         exec getnextkeys 'calendar_clndr_id', 1, @new_clndr_id OUTPUT                                                         

                                                                        

                                                                         INSERT INTO calendar (clndr_id, default_flag, clndr_name, proj_id, base_clndr_id, clndr_type, day_hr_cnt, week_hr_cnt, month_hr_cnt, year_hr_cnt)

                                                                         SELECT @new_clndr_id, default_flag, clndr_name + '-1', @pproj_id, base_clndr_id, 'CA_Project', day_hr_cnt, week_hr_cnt, month_hr_cnt, year_hr_cnt

                                                                         FROM calendar

                                                                         WHERE clndr_id = @cal_id

                                                                        

                                                                         UPDATE CALENDAR

                                                                         SET clndr_data = (SELECT clndr_data FROM calendar WHERE clndr_id = @cal_id)

                                                                         WHERE clndr_id = @new_clndr_id;

 

                                                                         --STEP 2 (change task of P2 from C2 to C3)

                                                                         UPDATE task

                                                                         SET clndr_id = @new_clndr_id

                                                                         WHERE proj_id = @pproj_id

                                                                         AND clndr_id = @cal_id

                                                                        

                                                                         SET @y = @y + 1                                                   

                                                     END            

                                 END

            ELSE

                                 BEGIN                            

                                                     --STEP 1 (create new cal C3 from C1 and give it to P2)

                                                     exec getnextkeys 'calendar_clndr_id', 1, @new_clndr_id OUTPUT

                                                    

                                                     INSERT INTO calendar (clndr_id, default_flag, clndr_name, proj_id, base_clndr_id, clndr_type, day_hr_cnt, week_hr_cnt, month_hr_cnt, year_hr_cnt)

                                                     SELECT @new_clndr_id, default_flag, clndr_name + '-1', @pproj_id, base_clndr_id, 'CA_Project', day_hr_cnt, week_hr_cnt, month_hr_cnt, year_hr_cnt

                                                     FROM calendar

                                                     WHERE clndr_id = (select c.cal_id from #calTable c)

                                                    

                                                     UPDATE CALENDAR

                                                     SET clndr_data = (SELECT clndr_data FROM calendar WHERE clndr_id = (select c.cal_id from #calTable c))

                                                     WHERE clndr_id = @new_clndr_id;

 

                                                     --STEP 2 (change task of P2 from C2 to C3)

                                                     UPDATE task

                                                     SET clndr_id = @new_clndr_id

                                                     WHERE proj_id = @pproj_id

                                                     AND clndr_id = (select c.cal_id from #calTable c)                                                       

                                 END

 

            -- INC x by 1

            SET @x = @x + 1

END

14.   ПРОВЕРКА НАЗНАЧЕНИЯ СПРАВОЧНИКА РАБОТ: ПРОЕКТ ПОТЕРЯЛ НАЗНАЧЕНИЕ КОДОВ СПРАВОЧНИКОВ И САМИ СПРАВОЧНИКИ

Проверка:

SELECT taskactv.actv_code_id, taskactv.proj_id, actvtype.actv_code_type_id, actvtype.proj_id FROM taskactv, actvtype WHERE taskactv.actv_code_type_id = actvtype.actv_code_type_id AND taskactv.proj_id <> actvtype.proj_id AND actvtype.actv_code_type_scope = 'AS_Project' AND actvtype.proj_id IS NOT NULL

Коррекция:

1.       В общем случае

WITH cte (ActivityCode, TaskID, TProjID, AProjID) AS (select t.actv_code_type_id, t.task_id, t.proj_id WrongProj, a.proj_id CorrectProj from taskactv t, actvtype a where t.actv_code_type_id = a.actv_code_type_id AND t.proj_id <> a.proj_id AND a.actv_code_type_scope = 'AS_Project' AND a.proj_id IS NOT NULL) update TASKACTV set proj_id = c.AProjID from TASKACTV ta join cte as c on c.TaskID = ta.task_id where ta.actv_code_type_id = c.ActivityCode  

 

2.       Если потерялись справочники работ между проектами

DECLARE @new_actvtype_id INT, @new_actvcode_id INT, @x INT, @count INT, @actvCode_id INT, @actvType_id INT, @tproj_id INT, @aproj_id INT

DECLARE @countC INT, @y INT, @actvCode_1 INT

 

DECLARE @actvtypeTable TABLE (

sno   INT IDENTITY(1, 1),

actv_code_id INT,

task_proj_id INT,

actv_code_type_id INT,

actv_proj_id INT)

 

DECLARE @actvCodeTable TABLE (

sno   INT IDENTITY(1, 1),

old_actv_code_id INT,

new_actv_code_id INT DEFAULT 0)

 

INSERT INTO @actvTypeTable

SELECT t.actv_code_id, t.proj_id, a.actv_code_type_id, a.proj_id

FROM taskactv t INNER JOIN actvtype a

ON t.actv_code_type_id = a.actv_code_type_id

AND t.proj_id <> a.proj_id

AND a.actv_code_type_scope = 'AS_Project'

AND a.proj_id IS NOT NULL;

 

SELECT @count = MAX (sno)

FROM @actvtypeTable

 

SET @x = 1

 

WHILE @x <= @count

BEGIN

 

    --STEP 1 (create new AT from ATP2 and give it to P2)

    exec getnextkeys 'actvtype_actv_code_type_id', 1, @new_actvtype_id OUTPUT

   

    SELECT @actvCode_id = actv_code_id, @tproj_id  = task_proj_id, @actvType_id = actv_code_type_id, @aproj_id = actv_proj_id

    FROM @actvTypeTable

    WHERE sno = @x

 

    INSERT INTO actvtype (actv_code_type_id, actv_short_len, seq_num, actv_code_type, actv_code_type_scope, proj_id, super_flag)

    SELECT @new_actvtype_id, actv_short_len, seq_num, actv_code_type + '-1', 'AS_Project', @aproj_id, super_flag

    FROM actvtype

    WHERE actv_code_type_id = @actvType_id

   

    --Put all AC for AT in table

    INSERT INTO @actvCodeTable (old_actv_code_id)

    SELECT actv_code_id

    FROM actvcode

    WHERE actv_code_type_id = @actvType_id

   

    SELECT @countC = MAX (sno)

    FROM @actvCodeTable

   

    SET @y = 1

    WHILE @y <= @countC

    BEGIN

 

                         SELECT @actvCode_1 = old_actv_code_id

                         FROM @actvCodeTable

                         WHERE sno = @y

 

                         --STEP 2 (create new AC from ATP2's AC and give it to P2)

                         exec getnextkeys 'actvcode_actv_code_id',1,@new_actvcode_id output

                        

                         INSERT INTO actvcode (actv_code_id, actv_code_type_id, seq_num, short_name, parent_actv_code_id, actv_code_name, color)

                         SELECT @new_actvcode_id, @new_actvtype_id, seq_num, short_name + '-1', parent_actv_code_id, actv_code_name + '-1', color

                         FROM actvcode

                         WHERE actv_code_id = @actvCode_1

 

                         UPDATE @actvCodeTable

                         SET new_actv_code_id = @new_actvcode_id

                         WHERE sno = @y         

 

                         SET @y = @y + 1

    END

 

    --STEP 3 (change taskactv of P2 from AC2, AT2 to AC3, AT3)

    UPDATE T  

    SET T.actv_code_type_id = @new_actvtype_id, T.actv_code_id = T2.new_actv_code_id

    FROM taskactv T INNER JOIN @actvCodeTable T2

    ON T.actv_code_id = T2.old_actv_code_id

    AND proj_id = @aproj_id

 

    --STEP 3 (change actvtype AC2 from P2 to P1)

    UPDATE actvtype

    SET proj_id = @tproj_id

    WHERE actv_code_type_id = @actvType_id

 

    -- INC x by 1

    SET @x = @x + 1

END

 

 

15.   ПРОВЕРКА НАЗНАЧЕНИЯ ДОКУМЕНТОВ: ПРОЕКТ ПОТЕРЯЛ НАЗНАЧЕНИЕ ДОКУМЕНТОВ (ЕСЛИ СВЯЗАННЫЙ ПРОЕКТ БЫЛ УДАЛЕН)

Проверка:

SELECT taskdoc.doc_id, taskdoc.proj_id, document.doc_id, document.proj_id FROM taskdoc, document WHERE taskdoc.doc_id = document.doc_id AND taskdoc.proj_id <> document.proj_id

Коррекция:

--Удаление связанных назначений
DELETE
FROM taskdoc WHERE EXISTS (SELECT 1 FROM document WHERE taskdoc.doc_id = document.doc_id AND taskdoc.proj_id <> document.proj_id)

16.   ПРОВЕРКА ПРОЕКТА: ПРОЕКТ ПОТЕРЯЛ ПРИВЯЗКУ К WBS

Проверка:

SELECT project.proj_id FROM project WHERE NOT EXISTS (SELECT projwbs.proj_id FROM projwbs WHERE projwbs.proj_id = project.proj_id)

Коррекция:

--Ошибки могут возникать при удалении проекта. Когда удаляется проект он невидим в макетах, но продолжает существовать в БД. Скрипт удаляет проект из БД физически.

select proj_id, proj_short_name FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id);

delete from RSRCHOUR where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from ISSUHIST where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKRSRC where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKPROC where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKPRED where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKPRED where pred_proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKNOTE where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKMEMO where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKFDBK where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from taskdoc where doc_id in (select doc_id from document where proj_id in (SELECT project.proj_id FROM project WHERE not exists (SELECT * FROM projwbs WHERE projwbs.proj_id = project.proj_id ) AND not exists (SELECT * from task WHERE project.proj_id = task.proj_id )

AND not exists (SELECT * from actvtype WHERE actvtype.proj_id = project.proj_id )));

delete from TASKACTV where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from RISKCTRL where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJISSU where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJCOST where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TRSRCSUM where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASK where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJRISK where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJEST where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from WBSSTEP where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));                                                           

delete from WBSMEMO where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));         

delete from WBSBUDG where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from TASKSUM where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJTHRS where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from EXTAPP where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from BUDGCHNG where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from RPTBATCH where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from RPT where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJPCAT where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJFUND where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from DOCUMENT where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from CALENDAR where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from ACTVCODE where actv_code_type_id in (select actv_code_type_id from ACTVTYPE where proj_id IN

(select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id )));

delete from ACTVTYPE where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJPROP where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJSHAR where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from PROJWBS where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

delete from VIEWPROP where proj_id IN (select proj_id FROM project WHERE not exists ( select * from projwbs where projwbs.proj_id = project.proj_id ));

DELETE FROM project WHERE not exists ( select *        from projwbs where projwbs.proj_id = project.proj_id);

 

17.   ПРОВЕРКА СВЯЗЕЙ МЕЖДУ ЗАДАЧАМИ: ПОТЕРЯ ПОСЛЕДОВАТЕЛЯ У СВЯЗИ МЕЖДУ ЗАДАЧАМИ

Проверка:

SELECT TASK_PRED_ID FROM TASKPRED TP WHERE not exists (SELECT * from TASK T WHERE T.TASK_ID = TP.PRED_TASK_ID AND T.PROJ_ID = TP.PRED_PROJ_ID)

Коррекция:

-- Удаление потерянных связей
Update TASKPRED set proj_id = (select proj_id from TASK T where T.task_id = TASKPRED.task_id) where proj_id <> (select proj_id from TASK T where T.task_id = TASKPRED.task_id);

Delete from TASKPRED where task_id not in (select distinct task_id from task);

18.   ПРОВЕРКА СВЯЗЕЙ МЕЖДУ ЗАДАЧАМИ: ПОТЕРЯ ПРЕДШЕСТВЕННИКА У СВЯЗИ МЕЖДУ ЗАДАЧАМИ

Проверка:

SELECT TASK_PRED_ID FROM TASKPRED TP WHERE not exists (select * from TASK T WHERE T.TASK_ID = TP.TASK_ID AND T.PROJ_ID = TP.PROJ_ID);

Коррекция:

-- Удаление потерянных связей

Update TASKPRED set proj_id = (select proj_id from TASK T where TASKPRED.task_id = T.task_id) where proj_id <> (select proj_id from TASK T where TASKPRED.task_id = T.task_id);

Delete from TASKPRED where pred_task_id not in (select distinct task_id from TASK);

19.   ПРОВЕРКА WBS: ПОТЕРЯ ВЛОЖЕННЫХ WBS, МЕЖДУ ПРОЕКТАМИ

Проверка:

SELECT wbs_id, parent_wbs_id, pw1.proj_id FROM projwbs pw1, project pr WHERE not exists ( select * from projwbs pw2 WHERE pw2.wbs_id = pw1.parent_wbs_id ) and pw1.parent_wbs_id is not null and pr.proj_id = pw1.proj_id and pr.orig_proj_id is null

Коррекция:

--Коррекция. Перенос всех вложенных WBS проектов на верхний уровень EPS

update PROJWBS set parent_wbs_id = (select wbs_id from PROJWBS where parent_wbs_id is null)
where parent_wbs_id not in (select wbs_id from PROJWBS) and parent_wbs_id is not null
and proj_id in (select proj_id from project where orig_proj_id is null)
    

 

 

Детали статьи

Последние обновление
8th of July, 2015

Вендор и версия программы
Oracle Primavera 6.x

Текущая статья
Нет текущих статей.
Вложение
Не найдено вложений.

Продолжить

Daily|Project © 2007 - 2019.