在更新,插入或删除之前检查触发器中的时间

时间:2018-05-01 20:57:59

标签: oracle plsql

我想创建一个触发器,将Who(Names)存储为Loged User,将Action存储为他/她所做的事,以及他/她创建的时间。但是它也应该能够在不工作时间时改变这些变化,例如工作时间可以是(从上午8点到凌晨00点到下午5点)。所以试图创造它。

//这是存储名为“System_events”的日志的表

create table system_events (who varchar2(10),action varchar2(10), when date);

实际上,触发器将检查并保存名为students

的表上的任何更改

//创建触发器的代码

create or replace trigger all_actions
before insert or update or delete on students
declare
user_action system_events.action%type;
begin
if INSERTING then
user_action :='Insert';
elsif UPDATING then
user_action :='Update';
elsif DELETING then
user_action :='Delete';
else
raise_application_error (-20001, 'Yous should never get this error.');
end if;
insert into system_events(who,action,when) values(user,user_action,sysdate);
end;

所以我创建的这个触发器正在工作。但它不会检查时间。所以我想补充一下检查时间的功能,如果不是在合适的时间,就会改变这个改变

谢谢!

1 个答案:

答案 0 :(得分:3)

不清楚你是什么意思"反叛变革"。我假设你想阻止用户进行任何DML操作,除非在工作时间。如果是这样,您可以添加另一个IF条件并在超过上午8点到下午5点之间提出异常。

CREATE OR replace TRIGGER all_actions 
  BEFORE INSERT OR UPDATE OR DELETE ON students 
DECLARE 
    user_action system_events.action%TYPE; 
BEGIN 
    IF inserting THEN 
      user_action := 'Insert'; 
    ELSIF updating THEN 
      user_action := 'Update'; 
    ELSIF deleting THEN 
      user_action := 'Delete'; 
    ELSE 
      raise_application_error (-20001, 'You should never get this error.'); 
    END IF; 

    IF to_number(to_char(SYSDATE, 'HH24')) NOT BETWEEN 8 AND 16 THEN 
      raise_application_error (-20001, 'You should not do ' 
                                       ||user_action 
                                       ||' operation during this time.'); 
    END IF; 

    INSERT INTO system_events 
                (who, 
                 action, 
                 when) 
    VALUES      (USER, 
                 user_action, 
                 SYSDATE); 
END; 
/

注意:如果没有IF

,您可以在检查操作类型之前设置此user_action条件