在一个表上建立触发器可以在触发器里再更新这个表吗?<在线>

haiyi8012 2003-09-12 03:21:30
CREATE OR REPLACE TRIGGER "TRI_SUM" AFTER
UPDATE ON "INDISUM" FOR EACH ROW BEGIN
IF UPDATING('JIAFEN') OR UPDATING('YONGFEN') OR UPDATING('JIANFEN') THEN
UPDATE INDISUM
SET NIANLEIJI = :NEW.JIAFEN - :NEW.YONGFEN - :NEW.JIANFEN,
PAIXU = :NEW.JIAFEN + :NEW.YONGFEN - :NEW.JIANFEN
WHERE "ID" = :OLD."ID";
END IF;
IF UPDATING('NIANLEIJI') OR UPDATING('SHANGNIAN') THEN
UPDATE INDISUM
SET ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN
WHERE "ID" = :OLD."ID";
END IF;
IF UPDATING('ZONGLEIJI') OR UPDATING('DONGJIE') THEN
UPDATE INDISUM
SET KEYONG = :NEW.ZONGLEIJI - :NEW.DONGJIE
WHERE "ID" = :OLD."ID";
END IF;

END TRI_SUM;
...全文
88 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
beckhambobo 2003-09-14
  • 打赏
  • 举报
回复
死循环触发,不可能实现
onejune4450 2003-09-14
  • 打赏
  • 举报
回复
在ID不被修改的情况下:
1.把after 换成 before
2.因为数值之间有关联,所以也不必判断那个被修改了,全部修正一遍省事。
CREATE OR REPLACE TRIGGER "TRI_SUM" before
UPDATE ON "INDISUM" FOR EACH ROW BEGIN
:new.NIANLEIJI = :NEW.JIAFEN - :NEW.YONGFEN - :NEW.JIANFEN
:new.PAIXU = :NEW.JIAFEN + :NEW.YONGFEN - :NEW.JIANFEN
:new.ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN
:new.KEYONG = :NEW.ZONGLEIJI - :NEW.DONGJIE
END TRI_SUM;
fuzhan820 2003-09-13
  • 打赏
  • 举报
回复
是不是表的字段类型不匹配。
create sequence SEQ_XT_LOG
minvalue 1
maxvalue 9999999999999999999999999999
start with 1062
increment by 1
cache 20
cycle;
下面的触发器的作用是:任何时候表中插入或更新了行, 当前的用户名和时间都记录入行中. 并且它保证给出了雇员名称并且薪水是一个正数.

CREATE TABLE emp (
empname text,
salary integer,
last_date timestamp,
last_user text
);

CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS '
BEGIN
-- 检查是否给出了 empname 和 salary
IF NEW.empname ISNULL THEN
RAISE EXCEPTION ''empname cannot be NULL value'';
END IF;
IF NEW.salary ISNULL THEN
RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
END IF;

-- 我们必须付帐给谁?
IF NEW.salary < 0 THEN
RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname;
END IF;

-- 记住何时何人的薪水被修改了
NEW.last_date := ''now'';
NEW.last_user := current_user;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
armu80830 2003-09-12
  • 打赏
  • 举报
回复
将after update 改为 before update,就可以更新NEW的值
CREATE OR REPLACE TRIGGER "TRI_SUM" BEFORE UPDATE ON "INDISUM" FOR EACH ROW
BEGIN
....
more_zou 2003-09-12
  • 打赏
  • 举报
回复
行级触发器无法对触发表进行操作,可以用两个触发器和一个包完成
minkoming 2003-09-12
  • 打赏
  • 举报
回复
好像是不可以的
hutulaodao 2003-09-12
  • 打赏
  • 举报
回复
会不会产生死循环?
haiyi8012 2003-09-12
  • 打赏
  • 举报
回复
但是,可以对‘NEW’中的数据进行更新吗?
这样做好像也不行,我试了,但编译不通。
Drate 2003-09-12
  • 打赏
  • 举报
回复
IF UPDATING('NIANLEIJI') OR UPDATING('SHANGNIAN') THEN
UPDATE INDISUM
SET ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN
WHERE "ID" = :OLD."ID";
---可以是可以,但不需要这样写了,你可以改一下,改成:
IF UPDATING('NIANLEIJI') OR UPDATING('SHANGNIAN') THEN
:NEW.ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN
END IF;

IF UPDATING('ZONGLEIJI') OR UPDATING('DONGJIE') THEN
:NEW.KEYONG = :NEW.ZONGLEIJI - :NEW.DONGJIE
END IF;


--

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧