在Oracle 11g中创建触发器

时间:2011-12-17 15:34:00

标签: oracle oracle11g

我想在Oracle 11g中创建一个触发器。问题是我想要一个每次有SELECT语句时都会运行的触发器。这是可能的还是有其他方法来实现相同的结果。这是PL / SQL块:

CREATE TRIGGER time_check
   BEFORE INSERT OR UPDATE OF users, passwd, last_login ON table
   FOR EACH ROW
   BEGIN
      delete from table where last_login < sysdate - 30/1440;
   END;

我正在尝试实现一个可以存储用户数据的表。我想“冲洗”超过一小时的行。还有其他替代方法可以实现这个吗?

p.s你能告诉我这个PL / SQL块是否正确。有什么错误吗?

BEGIN
sys.dbms_scheduler.create_job(
job_name => '"ADMIN"."USERSESSIONFLUSH"',
job_type => 'PLSQL_BLOCK',
job_action => 'begin
   -- Insert PL/SQL code here
   delete from UserSessions where last_login < sysdate - 30/1440;
end;',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=2',
start_date => systimestamp at time zone 'Asia/Nicosia',
job_class => '"DEFAULT_JOB_CLASS"',
comments => 'Flushes expired user sessions',
auto_drop => FALSE,
enabled => FALSE);
sys.dbms_scheduler.set_attribute( name => '"ADMIN"."USERSESSIONFLUSH"', attribute => 'job_priority', value => 5);
sys.dbms_scheduler.set_attribute( name => '"ADMIN"."USERSESSIONFLUSH"', attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FAILED_RUNS);
sys.dbms_scheduler.enable( '"ADMIN"."USERSESSIONFLUSH"' );
END;

1 个答案:

答案 0 :(得分:3)

我不知道选择触发器的方法。从the documentation开始,您可以触发的唯一语句是insert / delete / update(和一些DDL)。

对于您想要做的事情,我建议一个更简单的解决方案:使用DBMS_SCHEDULER包来安排每隔一段时间的清理工作。它不会增加您的选择查询的开销,因此它应该对全局性能影响较小。

您可以在Examples of Using the Scheduler

中找到大量示例