暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用触发器记录用户活动

ASKTOM 2021-04-07
626

问题描述

我正在APEX中实施流程。这个过程包括一些角色。该过程由在第一步中填写表格的人员启动。
输入的数据存储在集合中,并在提交后输入到相应的表中。这也启动了该过程的下一步。

现在我的问题是,我想在提交完表格后 (即第一个过程步骤完成后) 显示一种完成步骤的历史记录。
我在想一种日志表。
这总结了采取了哪些行动,谁采取了行动,以及在表格中输入了哪些其他重要信息 (例如,在表格中选择了哪个负责人等,表格的ID)。
-- create log tbl
create table form_submitted
log_id number not null,
Responsible_id1 number ,
Responsible_id2 number,
Responsible_id3 number,
Responsible_id4 number,
added_date date,
action varchar2(100);

alter table form_submitted add constraint pk_log_id PRIMARY KEY (log_id);
-- create sequence to autoincrement values
create sequence seq_log_id
start with 1
increment by 1
nocache
nocycle;
--create trigger to insert auto-incremented value
create or replace trigger bi_form_submitted
before insert 
on form_submitted
for each row 
begin
:new.log_id :=seq_log_id.nextval;
end;

为了实现这一点,我想到了创建一个触发器,该触发器将跟踪用户的活动并将必要的信息输入日志表中。
-- create trigger to track user activity and insert on logs table
create or replace trigger trg_user_activity
after insert or update or delete
on tbl1

for each row 
begin
  if deleting then 
  --insert data in tbl_logs
  insert into form_submitted
  (Responsible_id1,Responsible_id2, Responsible_id3, Responsible_id4,created_time, added_date, action)
  values
    (:new.Responsible_id1,:new.Responsible_id2,:new.Responsible_id3,:new.Responsible_id4, SYSDATE,to_char(SYSDATE,'HH:MI:SS PM'),SYSDATE, 'form_deleted');
end if;
if updating then 
  --insert data in tbl_logs
  insert into form_submitted
   (Responsible_id1,Responsible_id2, Responsible_id3, Responsible_id4,created_time, added_date, action)
  values
  (:new.Responsible_id1,:new.Responsible_id2,:new.Responsible_id3,:new.Responsible_id4, SYSDATE,to_char(SYSDATE,'HH:MI:SS PM'),SYSDATE, 'form_updated');

end if;
if inserting then 
  --insert data in tbl_logs
  insert into form_submitted
   (Responsible_id1,Responsible_id2, Responsible_id3, Responsible_id4,created_time, added_date, action)
  values
    (:new.Responsible_id1,:new.Responsible_id2,:new.Responsible_id3,:new.Responsible_id4, SYSDATE,to_char(SYSDATE,'HH:MI:SS PM'),SYSDATE, 'form_submitted');

end if;
end;

然后,我想在 “历史记录” 选项卡中将此表显示为经典报告。
每次用户进行更改时,它都会被记录并显示。但每次在不同的日志表中。这意味着在第二步中,另一个用户必须执行操作,该操作也应记录并显示在 “历史记录” 选项卡中。
目的是记录并显示该过程中每个用户的每个活动。

我希望对以下三件事有所帮助:

1.如何从另一个表 (此处为tbl1) 获取日志表所需的信息 (例如Responsible_id1)。
2.不同的用户编辑同一个表 (这意味着下一个用户将数据添加到同一个表中),但是必须在不同的日志表中进行不同的条目。我是否可以将触发器绑定到用户或此特定过程步骤。
3.成功完成第一个过程步骤后,如何显示当前状态 (这意味着用户下次登录时不必再次执行这些步骤,但他应该看到他目前在该过程的哪一步)?

一些建议已经非常有帮助了。
我对APEX相对较新,对开发不太熟悉。
我也不确定触发器是否是这种用例的正确通用解决方案。


专家解答

我有点困惑的例子-form_已提交日志表还是主表?这使得在这里给出详细的建议变得棘手。

1.Responsible_id1和其他值如何与源表中的值相关?

如果它们是触发表中的列,则可以使用: new/:old (删除时需要: old值) 访问它们的值。如果他们不是,我们需要更多关于他们如何与这里的帮助相关的细节。

2.您可以有一个if/case语句,该语句检查用户并插入到适当的表中。

但这听起来像你有一个每个用户的日志表。我建议不要这样做-这会使开发更加困难。有一个带有用户列的表,并存储

3.请澄清您在这里要实现的目标。这听起来像是你想要找到用户/进程的最新行,你可以用这样的查询来完成:

with rws as (
  select ..., 
         row_number () over (
           order by update_time desc
         ) rn
  from   ...
  where  ...
)
  select * from rws
  where  rn = 1;


还有其他方法; 在以下位置阅读这些内容:

https://blogs.oracle.com/sql/how-to-select-the-top-n-rows-per-group-with-sql-in-oracle-database#one-row-per-group

也就是说,我会尽可能避免触发器,而是构建一个PL/SQL API,例如:

create or replace package form_submission_mgr as 
  function insert_form ( ... ) 
    return table.id%type;
  procedure update_form ( ... );
  procedure delete_form ( ... );
end;
/


这些将根据需要从主表中插入/更新/删除,并同时记录。然后连接您的表单提交过程以调用适当的过程。

最后,如果你想要自动增加PK值,不需要触发器这样做:

:new.log_id :=seq_log_id.nextval;


要么将列声明为标识,要么将序列设置为列的默认值。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论