
# 创建和管理DWS定时任务
DWS支持用户创建定时任务，当设置的任务时间点到达后可以自动触发任务的执行，从而可以减少用户运维的工作量。
数据库兼容Oracle定时任务功能主要通过DBMS.JOB高级包提供的接口，可以实现定时任务的创建、任务到期自动执行、任务删除、修改任务属性（包括：任务id、任务的关闭开启、任务的触发时间、触发时间间隔、任务内容等）。
![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
- 定时任务的执行语句暂不记录到系统的[实时TopSQL](https://support.huaweicloud.com/devg-dws/dws_04_0397.html)日志中，仅8.2.1及以上集群版本支持记录。
- DWS 时间设置默认为UTC时间，定时任务的执行时间需根据用户所在时区差进行转换。
 
#### 定时任务管理
1. 创建测试表： 
   ```
   CREATE TABLE test(id int, time date);
   ```
   当结果显示为如下信息，则表示创建成功。
   ```
   CREATE TABLE
   ```
   
   
2. 创建自定义存储过程： 
   ```
   CREATE OR REPLACE PROCEDURE PRC_JOB_1()
   AS
   N_NUM integer :=1;
   BEGIN
   FOR I IN 1..1000 LOOP
   INSERT INTO test VALUES(I,SYSDATE);
   END LOOP;
   END;
   /
   ```
   当结果显示为如下信息，则表示创建成功。
   ```
   CREATE PROCEDURE
   ```
   
   
3. 创建任务： 
   - 新创建的任务（未指定job_id）表示每隔1分钟执行一次存储过程PRC_JOB_1。
     ```
     call dbms_job.submit('call public.prc_job_1(); ', sysdate, 'interval ''1 minute''', :a);
     job
     -----
     1
     (1 row)
     ```
     
   
   - 指定job_id创建任务。
     ```
     call dbms_job.isubmit(2,'call public.prc_job_1(); ', sysdate, 'interval ''1 minute''');
     isubmit
     ---------
     (1 row)
     ```
     
   
   
   
   
4. 通过USER_JOBS视图查看当前用户已创建的任务信息。 
   需要有系统管理员权限才可以访问此系统视图，字段说明详见[表1](https://support.huaweicloud.com/devg-dws/dws_04_0866.html#ZH-CN_TOPIC_0000001811609909__tfc79ceaea73a45b685f452da34d39554)。
   ```
   select job,dbname,start_date,last_date,this_date,next_date,broken,status,interval,failures,what from user_jobs;
    job |  dbname  |         start_date         |         last_date          |         this_date          |      next_date      | broken | status |      interval       | failures |           what
   -----+----------+----------------------------+----------------------------+----------------------------+---------------------+--------+--------+---------------------+----------+----------------
   -----------
      1 | db_demo | 2022-03-25 07:58:01.829436 | 2022-03-25 07:58:03.174817 | 2022-03-25 07:58:01.829436 | 2022-03-25 07:59:01 | n      | s      | interval '1 minute' |        0 | call public.prc
   _job_1();
      2 | db_demo | 2022-03-25 07:58:15.893383 | 2022-03-25 07:58:16.608959 | 2022-03-25 07:58:15.893383 | 2022-03-25 07:59:15 | n      | s      | interval '1 minute' |        0 | call public.prc
   _job_1();
   (2 rows)
   ```
   
   
5. 停止任务。 
   ```
   call dbms_job.broken(1,true);
   broken
   --------
   (1 row)
   ```
   
   
6. 启动任务。 
   ```
   call dbms_job.broken(1,false);
   broken
   --------
   (1 row)
   ```
   
   
7. 修改任务属性。 
   - 修改JOB的Next_date参数信息。例如，修改Job1的Next_date为1小时以后开始执行。
     ```
     call dbms_job.next_date(1, sysdate+1.0/24);
     next_date
     -----------
     (1 row)
     ```
     
   
   - 修改JOB的Interval参数信息。例如，修改Job1的Interval为每隔1小时执行一次。
     ```
     call dbms_job.interval(1,'sysdate + 1.0/24');
     interval
     ----------
     (1 row)
     ```
     
   
   - 修改JOB的What参数信息。例如，修改Job1的What为执行SQL语句"insert into public.test values(333, sysdate+5);"。
     ```
     call dbms_job.what(1,'insert into public.test values(333, sysdate+5);');
     what
     ------
     (1 row)
     ```
     
   
   - 同时修改JOB的Next_date、Interval、What等多个参数信息。
     ```
     call dbms_job.change(1, 'call public.prc_job_1();', sysdate, 'interval ''1 minute''');
     change
     --------
     (1 row)
     ```
     
   
   
   
   
8. 删除JOB。 
   ```
   call dbms_job.remove(1);
   remove
   --------
   (1 row)
   ```
   
   
9. JOB的权限控制。 
   - 当创建一个JOB时，该JOB会和创建该JOB的数据库和用户绑定（即：pg_job系统视图新增的JOB记录中的dbname和log_user）。
   
   - 如果当前用户是DBA用户、系统管理员、该JOB的创建用户（即：pg_job中的log_user），那么该用户有权限通过高级包接口remove、change、next_date、what、interval删除或修改JOB的参数信息。否则，会提示当前用户没有权限操作该JOB。
   
   - 如果当前数据库是该JOB创建所属的数据库（即：为pg_job系统视图中的dbname），那么连接到当前数据库上可以通过高级包接口remove、change、next_date、what、interval删除或修改JOB的参数信息。
   
   - 当删除JOB所属的数据库（即：为pg_job系统视图中的dbname）时，系统会关联删除该数据库从属的JOB记录。
   
   - 当删除JOB所属的用户（即：为pg_job系统视图中的log_user）时，系统会关联删除该用户从属的JOB记录。
   
   
   
   
 
