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

Oracle 在更新、插入或删除之前检查触发器中的时间,oracle,plsql,Oracle,Plsql,我想创建一个触发器,用于存储谁(命名)为登录用户、他/她所做的操作以及他/她完成操作的时间。但是,它也应该能够在非工作时间重新进行更改,例如工作时间可以是(从上午8:00到下午5:00)。所以我试着去创造它 //这是用于存储名为“System_events”的日志的表 实际上,触发器将检查并保存名为students的表上的任何更改 //创建触发器的代码 create or replace trigger all_actions before insert or update or delete

我想创建一个触发器,用于存储谁(命名)为登录用户、他/她所做的操作以及他/她完成操作的时间。但是,它也应该能够在非工作时间重新进行更改,例如工作时间可以是(从上午8:00到下午5:00)。所以我试着去创造它

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

实际上,触发器将检查并保存名为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;
所以我创建的触发器正在工作。但是它不检查时间。因此,我想添加一个功能,即检查时间,如果时间不对,则重新更改


谢谢

不清楚你所说的“重新改变”是什么意思。我假设您希望阻止用户在工作时间之外执行任何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\u操作

不清楚“重新更改”是什么意思。我假设您希望阻止用户在工作时间之外执行任何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\u action

谢谢您的回答@Kaushik-Nayak,我只是想说触发器应该阻止任何操作,包括在非工作时间插入、删除和更新。。。但无论如何,你做对了,你给了我正确的解决方案。@Lenz Vital:不客气。请接受正确的答案。这将帮助人们寻找类似问题的答案谢谢你的回答@Kaushik Nayak,我只是想说触发器应该阻止任何操作,包括在非工作时间插入、删除和更新。。。但无论如何,你做对了,你给了我正确的解决方案。@Lenz Vital:不客气。请接受正确的答案。这将有助于寻求类似问题答案的人检查我的答案,并让我知道它有帮助。请同时阅读:stackoverflow.com/help/someone-answers检查我的答案并让我知道它有帮助。请同时阅读:stackoverflow.com/help/someone-answers