2011-12-17 4 views
1

Я хочу создать триггер в Oracle 11g. Проблема в том, что я хочу триггер, который запускается каждый раз, когда есть инструкция SELECT. Возможно ли это или есть другой способ добиться того же результата. Это блок PL/SQL:Создать триггер в Oracle 11g

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

Я пытаюсь реализовать таблицу, в которой можно хранить пользовательские данные. Я хочу «смыть» строки, которые устарели, чем один час. Можете ли вы предложить другие альтернативы, как я могу это реализовать? –

+0

Я отредактировал ваш вопрос, чтобы добавить то, что вы разместили в своем комментарии, так как это актуально. (Вы можете сделать это самостоятельно в следующий раз - убедитесь, что ваш вопрос содержит всю необходимую информацию.) – Mat

+0

Возможно, вам понадобится фиксация, нет? – Ben

ответ

3

Я не знаю о способе включения спускового крючка на выбор. С the documentation единственными операциями, которые вы можете включить, являются вставка/удаление/обновление (и некоторые DDL).

Для того, что вы хотите сделать, я бы предложил более простое решение: используйте пакет DBMS_SCHEDULER, чтобы запланировать работу по очистке так часто. Он не добавит лишних запросов к выбранным запросам, поэтому он должен иметь меньшее влияние на производительность во всем мире.

Вы найдете много примеров в: Examples of Using the Scheduler

+0

+1 Определенно нет необходимости в триггере ... – Ben

+0

ОК, я согласен. Я могу использовать инструкции SQL каждый раз до загрузки страниц или DBMS_SCHEDULER. Какой из них будет использовать меньше ресурсов? –

+0

Это зависит от того, как часто вам нужны данные, очищенные. Если это всего лишь «около часа», и вам все равно, есть ли там немного больше, работа «DBMS_SCHEDULER» (возможно, каждые 15 минут или около того) будет относительно дешевой. Если вам нужно, чтобы данные были очищены строго, то вы _need_, чтобы оплатить стоимость запроса на одну страницу или что-то подобное. – Mat

Смежные вопросы