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