f公司施行新的IT安全制度后,系统使用的帐号也要90天换一次密码。
原先通过Solaris的Cron执行的Oracle上的任务,在密码到期未改时,就停止执行了。(是否更改Solaris配置可以避免?没去深究)
此外,Oracle的账户密码更改后,要修改保存密码的Script文件。麻烦不说,系统安全上也有瑕疵。
其实,如果是纯粹在Oracle内部执行的任务,可以通过Oracle的Scheduller来实现。(要和OS打交道的任务是否可以?还没试过。)
在Oracle 10.2.0.3版测试后,发现密码更改(password change),密码失效(password expire),甚至帐号死锁(account locked)的情况下还可以照常执行任务。
1. Create a table for test.
CREATE TABLE "AT_TEST"
( "NO" NUMBER(2,0),
"MESSAGE" VARCHAR2(30),
"CREATE_DATE" DATE
)
/
15:07……
2. Create test job via scheduller
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'test',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into AT_TEST values(10,'Test',sysdate);',
start_date => SYSDATE,
repeat_interval => 'freq=weekly; byday=mon,tue,wed,thu,fri; byhour=15-18; byminute=0,5,10,15,20,25,30,35,40,45,50,55; bysecond=0;',
enabled => TRUE
);
END;
/
15:15……
3. Change password
alter user at identified by abcde;
insert into AT_TEST values(20,'password changed.',sysdate);
15:20……
4. Password expired
SQL> alter user at password expire;(by DBA)
insert into AT_TEST values(30,'password expired.',sysdate);
15:27
5. Lock user account
SQL> alter user at account lock;(by DBA)
insert into AT_TEST values(40,'ID locked.',sysdate);
15:37……
6. Disable Job
BEGIN
dbms_scheduler.disable('test');
END;
/
15:42……
7. Check log
select t.*, to_char(CREATE_DATE,'hh24:mi:ss') TIME from AT_TEST t order by CREATE_DATE;
NO |
MESSAGE |
CREATE_DATE |
TIME |
10 |
Test |
10/17/2012 |
15:10:00 |
10 |
Test |
10/17/2012 |
15:15:00 |
20 |
password changed. |
10/17/2012 |
15:15:46 |
10 |
Test |
10/17/2012 |
15:20:00 |
30 |
password expired. |
10/17/2012 |
15:21:45 |
10 |
Test |
10/17/2012 |
15:25:00 |
40 |
ID locked. |
10/17/2012 |
15:27:45 |
10 |
Test |
10/17/2012 |
15:30:00 |
10 |
Test |
10/17/2012 |
15:35:00 |
附:
Schedule确认SQL
select job_name,job_type,job_action,
to_char(start_date,'yyyy-mm-dd hh24:mi:ss') start_date,
to_char(NEXT_RUN_DATE,'yyyy-mm-dd hh24:mi:ss') Next_run_date,
repeat_interval,enabled,state from user_scheduler_jobs;
JOB_NAME | JOB_TYPE | JOB_ACTION | START_DATE | NEXT_RUN_DATE | REPEAT_INTERVAL |
---|---|---|---|---|---|
TEST | PLSQL_BLOCK | insert into AT_TEST values(10,'Test',sysdate); | 2012-10-17 15:05:25 | 2012-10-17 15:45:00 | freq=daily; byhour=9,10,11,12,13,14,15,16,17,18,21; byminute=0,10,15,20,25,30,35,40,45,50,55; bysecond=0; |
ENABLED | STATE |
---|---|
FALSE | DISABLED |
使任务无效
BEGIN
dbms_scheduler.disable('test');
END;
/
使任务生效
BEGIN
dbms_scheduler.enable('test');
END;
/
修改任务属性(修改频度repeat_interval属性)
BEGIN
dbms_scheduler.set_attribute('test','repeat_interval', 'freq=daily; byhour=9,10,11,12,13,14,15,16,17,18,21; byminute=0,10,15,20,25,30,35,40,45,50,55; bysecond=0;');
END;
/
删除任务
BEGIN
DBMS_SCHEDULER.drop_JOB(
job_name => 'test'
);
END;
/