今天在维护用户的帐号状态的时候碰到这个问题。和同事讨论这个问题的时候,我认为即使用户的帐号被锁定,JOB也可以运行。
用一个建立例子来说明这个问题:
SQL> conn / as sysdba
Connected.
SQL> create user u_test identified by u_test default tablespace ndmain;
User created.
SQL> grant connect, resource to u_test;
Grant succeeded.
SQL> conn u_test/u_test
Connected.
SQL> create table t (time date);
Table created.
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> declare
2 v_job number;
3 begin
4 dbms_job.submit(v_job, 'begin insert into t values (sysdate); end;', to_date('2009-8-26 11:0:0'));
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> col what format a45
SQL> select job, what, next_date from user_jobs;
JOB WHAT NEXT_DATE
---------- --------------------------------------------- -------------------
50 begin insert into t values (sysdate); end; 2009-08-26 11:00:00
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-08-26 10:44:22
建立一个U_TEST用户,授权必要的权限,然后建立一张测试表,并设定一个JOB,在11点的时候向测试表中插入系统时间。
现在的时间是10点44分,下面锁住U_TEST用户:
SQL> conn / as sysdba
Connected.
SQL> alter user u_test account lock;
User altered.
SQL> select username, account_status
2 from dba_users
3 where username = 'U_TEST';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
U_TEST LOCKED
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-08-26 10:45:59
SQL> select * from u_test.t;
no rows selected
锁定用户后,目前的时间是10点46分左右,U_TEST用户下的T表还没有记录,等待一段时间后:
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-08-26 10:59:18
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-08-26 11:00:50
SQL> select * from u_test.t;
TIME
-------------------
2009-08-26 11:00:01
SQL> select username, account_status, lock_date
2 from dba_users
3 where username = 'U_TEST';
USERNAME ACCOUNT_STATUS LOCK_DATE
------------------------------ -------------------------------- -------------------
U_TEST LOCKED 2009-08-26 10:44:52
可以看到,在11点的时候JOB运行,向测试表中插入了JOB运行时的系统时间。而检查U_TEST用户可以发现,从10点44分起,这个用户一直处于锁定状态。
这说明JOB的运行和用户是否被锁定无关,因为JOB的运行并不需要登陆操作。以前碰到过的一个问题从另一方面说明了这一点:JOB自动执行出错,但手工执行正常——浅谈job和database link的一个特点: