Пресъздаване на database jobs

 Общи  Коментарите са изключени за Пресъздаване на database jobs
Апр. 122013
 

Това ми се наложи да го правя наскоро и искам да си запиша скриптовете за бъдеща употреба. Целта ми беше да дропна избрани job-ове и да ги създам с друг потребител. Но може да се направи и при всяка нужда от промяна.

За стандартните dbms_job използвах следния скрипт:

create or replace function get_dbms_job_ddl(v_job in number) return varchar2 is
  v_tmp varchar2(4000);
begin
	dbms_ijob.full_export(v_job, v_tmp);
	return v_tmp;
end;
/

select 'dbms_ijob.remove(' || job || ');'
  from dba_jobs
 where log_user = 'OLDUSER';

select replace(get_dbms_job_ddl(job), '''OLDUSER''', '''NEWUSER''')
  from dba_jobs
 where log_user = 'OLDUSER';

Ако има job-ове с по-дълъг WHAT, може да се наложи използването на CLOB вместо varchar2(4000). Оставям тази промяна на любопитния читател 😉
Също така REPLACE-а може да счупи нещо, така че внимавайте какво копирате.

За DBMS_SCHEDULER jobs използвах (внимание! Изиска допълнителна обработка. Прочети до края):

select 'exec DBMS_SCHEDULER.drop_job (job_name => ''' || owner || '.' || job_name || ''');'
  from dba_scheduler_jobs
 where job_creator = 'OLDUSER';

select dbms_metadata.get_ddl('PROCOBJ', job_name, owner)
  from dba_scheduler_jobs
 where job_creator = 'OLDUSER';

Като цяло DBMS_METADATA не се справя много блестящо. Първо типа на обекта е невероятното ‘PROCOBJ’ (PROCedural OBJect), което звучи като някаква набързо скалъпена кръпка. Освен това направи някакви безумни кавички, които след това с replace-нах за да изглежда по-добре. А най-тъпото е, че изобщо не се усети да сложи owner при създаването на job-а, та трябваше да го лепя на ръка.
Но все пак свърши грубата работа.

 Posted by at 7:05