oracle 如何调度将在sql开发人员中自动运行触发器,该触发器将从表中清除30天前的数据

zkure5ic  于 2022-11-03  发布在  Oracle
关注(0)|答案(3)|浏览(121)

我想运行一个调度程序,它运行一个触发器,它应该是自动清除的数据,这是超过30days.so我们已经有一个触发器如下,我们需要的东西来调度该触发器自动一旦它达到30天。在这里,天应该是可配置的
下面是我为此创建的触发器。

CREATE TRIGGER sampleTrigger
    ON database1.dbo.table1
    FOR DELETE
AS
    DELETE FROM database1.dbo.table1
    WHERE date < DATEADD(day, -30, GETDATE())
GO

还有,上面的触发器出了问题,因为现在我得到了以下错误
ORA-04071:缺少“之前”、“之后”或“代替”。
有人能请帮助我在这上面的触发器什么错误,我怎么能使这自动使用调度程序,将清理30天前的数据从一个表

4c8rllxm

4c8rllxm1#

正如所评论的,trigger不是一个合适的 * 工具 *-将它转换为一个存储过程(使用Oracle的语法;无法判断您发布的代码属于哪个数据库),然后安排一个每月运行该过程的作业。
另外,请注意,向后删除“30天”可能会导致问题,因为并非所有日期都有30天;也许您更愿意使用“1个月”。
示例表:

SQL>   SELECT *
  2      FROM test
  3  ORDER BY datum DESC;

        ID DATUM
---------- ----------
         4 15.10.2022
         3 28.09.2022
         2 15.08.2022   --> should be deleted today (21st of October 2022)
         1 30.07.2022   --> should be deleted

删除超过1个月的行的过程;如果您确实需要30天,请将where子句修改为< trunc(sysdate) - 30

SQL> CREATE OR REPLACE PROCEDURE p_del
  2  IS
  3  BEGIN
  4     DELETE FROM test
  5           WHERE datum < ADD_MONTHS (TRUNC (SYSDATE), -1);
  6  END;
  7  /

Procedure created.

让我们计划一个作业:

SQL> BEGIN
  2     DBMS_SCHEDULER.CREATE_JOB (
  3        job_name         => 'p_delete_test',
  4        job_type         => 'PLSQL_BLOCK',
  5        job_action       => 'BEGIN p_del; end;',
  6        start_date       =>
  7           TO_TIMESTAMP_TZ ('21.10.2022 03:00 Europe/Zagreb',
  8                            'dd.mm.yyyy hh24:mi TZR'),
  9        repeat_interval  => 'FREQ=MONTHLY; BYHOUR=3; BYMINUTE=0',
 10        enabled          => TRUE,
 11        comments         => 'Deleting rows older than 30 days');
 12  END;
 13  /

PL/SQL procedure successfully completed.

SQL>

通过查询user_scheduler_jobs查看作业信息,例如:

SQL> SELECT TO_CHAR(last_start_date, 'dd.mm.yyyy hh24:mi:ss') last_start,
  2         TO_CHAR(next_run_date  , 'dd.mm.yyyy hh24:mi:ss') next_run_date
  3  FROM user_scheduler_jobs
  4  where job_name = 'P_DELETE_TEST';

LAST_START          NEXT_RUN_DATE
------------------- -------------------
                    21.11.2022 03:00:00

SQL>

我们不会等到下个月,所以我将手动运行它:

SQL> BEGIN
  2     DBMS_SCHEDULER.run_job ('p_delete_test');
  3  END;
  4  /

PL/SQL procedure successfully completed.

结果:

SQL>   SELECT *
  2      FROM test
  3  ORDER BY datum DESC;

        ID DATUM
---------- ----------
         4 15.10.2022
         3 28.09.2022

SQL>

如果您不再需要该作业,请将其删除:

SQL> BEGIN
  2     DBMS_SCHEDULER.drop_job ('P_DELETE_TEST');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>
iaqfqrcu

iaqfqrcu2#

触发器不用于调度。请根据需要使用DBMS_SCHEDULER。

guz6ccqo

guz6ccqo3#

您正在使用的T-sql语法(由MS SQLserver使用)不适用于Oracle。
如果您使用的是Oracle数据库,则使用Oracle语法创建触发器:

create trigger <trigername> [BEFORE/AFTER/INSTEAD OF]  [INSERT/UPDATE/DELETE] on <table_name>

Oracle中的触发器可以设置为INSERT、UPDATE、DELETE或LOGON、LOGOFF等数据库操作。尽管如此,正如其他人指出的那样,触发器在这里对您没有帮助。
在您的情况下,您需要根据某个列值截断表,因此最好的选择是设置一个dbms调度程序作业,以运行sql脚本/plsql proc并清除表中较旧的数据。

相关问题