我想创建一个触发器,将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;
所以我创建的这个触发器正在工作。但它不会检查时间。所以我想补充一下检查时间的功能,如果不是在合适的时间,就会改变这个改变
谢谢!
答案 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
条件