我想在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;
答案 0 :(得分:3)
我不知道选择触发器的方法。从the documentation开始,您可以触发的唯一语句是insert / delete / update(和一些DDL)。
对于您想要做的事情,我建议一个更简单的解决方案:使用DBMS_SCHEDULER
包来安排每隔一段时间的清理工作。它不会增加您的选择查询的开销,因此它应该对全局性能影响较小。