oracle - 创建 aiu_trigger ,表可以被多个用户修改
问题描述
我正在实现一个触发器,它会在表 1 发生更改时立即触发。在这种情况下,第一个用户是学生,他可以使用表单编辑此表。然后触发器在所谓的 AUDIT 表中记录谁做了什么以及什么时候以他们想要的形式。但是,我有以下问题:
一个人可以被选为几个表格的负责人
但是,如果此人编辑了为他准备的表格或表格,则所执行的操作应仅记录在此表格中。但是,目前,触发器会查看此人作为负责人输入的表格,并将其记录在它找到的所有行中。
create or replace TRIGGER TRG_AUDIT_TBL1 -- starts on every update or insert command AFTER INSERT OR UPDATE ON TBL1 FOR EACH ROW DECLARE v_user varchar2(30); v_userid USERS.UUID%TYPE; v_done_action varchar2(50); v_stud_id STUDENTS.ID%TYPE; v_resp RESPONSIBLE.ID%TYPE; v_form_id form.id%TYPE; does_exist number; BEGIN v_user := SYS_CONTEXT('APEX$SESSION','APP_USER'); select UUID into v_userid from users where lower(username)=lower(v_user); select count(*) into does_exist from STUDENTS where uuid in (select UUID from users where uuid=v_userid); if (does_exist>0) then select STUID into v_stud_id from students where uuid = v_userid; end if; select count(*) into does_exist from respsonsible where uuid in (select UUID from users where uuid=v_userid); if (does_exist>0) then select r.ID, f.ID into v_resp,v_form_id from RESPONSIBLE r left outer join forms f on r.respid=i.ID where r.uuid = v_userid ; end if; IF :NEW.STATE ='REQUESTED' then v_done_action :='test123'; ELSIF :NEW.STATE ='APPROVED_BY_RESP' THEN v_done_action :='test1234.'; ELSIF :NEW.STATE ='DENIED_BY_RESP' THEN v_done_action :='test12345.'; ELSIF :NEW.STATE ='CHANGE_REQUEST_BY_RESP' THEN v_done_action :='test123456.'; END IF; IF ( v_stud_id = :NEW.STUID) or ( v_resp=:NEW.RESPID) and (:OLD.STATE <>:NEW.STATE) then INSERT INTO AUDIT_TBL1 (FORMID,DONE_ACTION,COLUMN1,STATE) VALUES (:NEW.ID,v_done_action,:NEW.COLUM1,:NEW.STATE); END IF; END;
所以我想知道是否有可能说 AUDIT_TBL1 表上的插入应该只发生在表 1 的 ID 与负责人编辑的 ID 相同的行中。或者换句话说,在 AUDIT_TBL1 中插入更新/编辑的 tbl1 id 等于表 1 中的 id。我知道代码远非完美,但如果能特别澄清这个问题,我将不胜感激。
我已经被困在这里很长时间了,非常感谢任何帮助:)
然后触发触发器,但正如您所见,它还会为负责人未更改但他作为负责人输入的行创建一个条目。
但是,我宁愿这种情况发生
对于负责人刚刚更改的行,仅在审计表中创建一个条目。
特别是在这种情况下,问题是是否可以在 APEX 中找出当前正在修改的行并获取某个列的值(此处为 Form ID),然后仅在审计表中为此创建一个条目价值。
解决方案
正如其他人在评论中所说,很难从您提供的信息中理解您正在尝试做什么。但是要在黑暗中开枪......你说一个人可以负责多种形式,所以在我看来这段代码应该在下面失败......
if (does_exist>0) then
select r.ID, f.ID
into v_resp,v_form_id
from RESPONSIBLE r
left outer join forms f on r.respid=i.ID
where r.uuid = v_userid ;
end if;
如果用户有多个职责或多个表单,那么这将得到一个 too_many_rows 错误。不是您描述的症状,而是我相信您发布的代码会发生什么。
我猜你必须做些什么来修复它,将在上面的选择中添加一些条件,指定责任/表格(我只能假设这些记录在 TBL1 中,因此可以使用:NEW.Fieldname 访问)
推荐阅读
- arrays - 数组减少:另一个数组中数组长度的总和
- c++ - 用模板方法替换隐式删除的运算符
- docker - 无法使用 python uwsgi 运行 docker 容器
- sass - 如何在 Dart Web 应用的缩小 CSS 中包含打包的 CSS 资源
- seo - 如何解决这些 Google Search Console 问题?
- javascript - 在javascript中停止一个字符在空中跳跃
- spring-boot - Gradle'war'插件如何更改档案的名称
- javascript - Javascript将对象数组分组为两个值的组合
- php - 在 codeigniter 3 上加载数据库后遇到未捕获的异常
- php - 是否可以暂停 php 脚本然后更改执行时间然后继续?