有两个表,比如Emp(eID,sName), EmpDesc(eID,e1,e2,e3)
两表关联,外键是eID当用户插入、修改、删除员工信息的时候,会同时操作以上两个表需要建立一个Trigger,当以上两个表有Insert/Update/Delete操作的时候,记录下信息到EmpAudit(eID,sName,e1,e2,e3,user,sysdate)表 请问该如何建立Trigger呢 ?谢谢
两表关联,外键是eID当用户插入、修改、删除员工信息的时候,会同时操作以上两个表需要建立一个Trigger,当以上两个表有Insert/Update/Delete操作的时候,记录下信息到EmpAudit(eID,sName,e1,e2,e3,user,sysdate)表 请问该如何建立Trigger呢 ?谢谢
before insert
or update
or delete
on 表名
for each row
begin
insert into 表名(......)
end;
主表细表更新就更新
主表delete不知道了 难道你要delete EmpAudit中相应的内容?
但应在操作表中记录操作类型(optype),比如insert、update、delete等
在两个表上分别建立触发器,如:
CREATE OR REPLACE TRIGGER tr_iud_emp
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
DECLARE
v_opType VARCHAR2(20);
BEGIN
IF inserting THEN
INSERT INTO EmpAudit (eid, sname, optype) VALUES (:new.eid, :new.sname, 'INSERT');
ELSIF updating THEN
INSERT INTO EmpAudit (eid, sname, optype) VALUES (:new.eid, :new.sname, 'UPDATE');
ELSE
INSERT INTO EmpAudit (eid, sname, optype) VALUES (:old.eid, :old.sname, 'DELETE');
END IF;
END tr_iud_emp;
/
CREATE OR REPLACE TRIGGER tr_iud_empdesc
AFTER INSERT OR UPDATE OR DELETE ON empdesc
FOR EACH ROW
DECLARE
v_opType VARCHAR2(20);
BEGIN
IF inserting THEN
INSERT INTO EmpAudit
(eid, e1, e2, e3, optype)
VALUES
(:new.eid, :new.e1, :new.e2, :new.e3, 'INSERT');
ELSIF updating THEN
INSERT INTO EmpAudit
(eid, e1, e2, e3, optype)
VALUES
(:new.eid, :new.e1, :new.e2, :new.e3, 'UPDATE');
ELSE
INSERT INTO EmpAudit
(eid, e1, e2, e3, optype)
VALUES
(:old.eid, :old.e1, :old.e2, :old.e3, 'DELETE');
END IF;
END tr_iud_empdesc;
/
这么做可以实现,但需要在第二个触发器中先根据eid到emp表查找name 然后再插入到EmpAudit表中,
而不要第一个触发器。 也就是说只在empdesc表上建立trigger就可以了。谢谢了阿!
Emp(eID,sName) --eID is primary key
EmpDesc(eID,edID) --edID is primary key
日志表:
EmpAudit(eaID,eID,sName) --eaID is primary key
EmpAuditSub(easID,eaID,edIDstr,sName) --easID is primary key
其中edIDstr字段:是一个字符串,如"1+2+3"
业务处理:
insert into Emp(eID,sName) values (1,'mike');
insert into EmpDesc(eID,e1) values(1,1);
insert into EmpDesc(eID,e1) values(1,2);
insert into EmpDesc(eID,e1) values(1,3);
--(这四条语句作为一个事务提交。)
想通过trigger实现纪录日志的功能,将上面的操作记录的下面的日志表中:
例如我要执行某种业务,会对Emp和EmpDesc表插入上面的四条记录,
我想通过trigger得到的结果是:
EmpAudit表一条记录,结果为 1,1,mike
EmpAuditSub表一条记录, 结果为 1,1,1+2+3,mike如果用procedure来在代码中调用实现起来会很简单,但如果用trigger来做,就很难实现了阿。在Emp表作trigger,则取不到EmpDesc表中的e1字段的值;
如果在EmpDesc表作trigger,则又无法将三条记录的e1字段组合成一个字符串存成一条记录,并且也无法获取到EmpAudit表的主键eaID,很是头疼。