【有关触发器方面的问题】﹐进者有分﹗

wanglight 2003-08-18 08:41:28
我先在oracle8.1.7的sql*plus中用
CREATE TABLE "SYSTEM"."TEST_B"("NAME" CHAR(10) NOT NULL, "SCORE" NUMBER(3, 1))
建立了Table Test_B;
后又通过
CREATE OR REPLACE TRIGGER "SYSTEM"."TRIGGER_STATE" AFTER INSERT OR
DELETE OR
UPDATE OR
INSERT
ON "TEST_B" FOR EACH ROW
DECLARE
V_TOTAL NUMBER;
BEGIN
SELECT count(*) total_name INTO V_TOTAL from Test_B;
IF (V_TOTAL>5) THEN
DELETE FROM test_state;
INSERT INTO test_state_bak (total_name)
VALUES (V_TOTAL);
END IF;
END TRIGGER_STATE ;
建立了触发器TRIGGER_STATE;
但当执行INSERT INTO TEST_B(NAME) VALUES('f');时
在sql*plus中会出现如下的提示
ORA-04091: 表格 SYSTEM.TEST_B 正在变更中, 触发程序/函数无法检视它
ORA-06512: 在 "SYSTEM.TRIGGER_STATE", line 4
ORA-04088: 执行触发程序 'SYSTEM.TRIGGER_STATE' 时发生错误
请高手指点﹐谢谢﹗


...全文
26 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
keyset 2003-09-03
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2211/2211258.xml?temp=.8503076
klbt 2003-08-23
  • 打赏
  • 举报
回复
up.
dihai2000 2003-08-19
  • 打赏
  • 举报
回复
同意楼上的
networld2002 2003-08-19
  • 打赏
  • 举报
回复
学习
beckhambobo 2003-08-19
  • 打赏
  • 举报
回复
方法一:
CREATE OR REPLACE TRIGGER TRIGGER_STATE
before INSERT OR DELETE OR UPDATE ON TEST_B
FOR EACH ROW
DECLARE
V_TOTAL NUMBER;
BEGIN
SELECT count(*) INTO V_TOTAL from Test_B;
IF (V_TOTAL>4) THEN
DELETE FROM test_state;
INSERT INTO test_state_bak (total_name) VALUES (V_TOTAL);
END IF;
END TRIGGER_STATE ;
/
方法二:
CREATE OR REPLACE TRIGGER TRIGGER_STATE
after INSERT OR DELETE OR UPDATE ON TEST_B
DECLARE
V_TOTAL NUMBER;
BEGIN
SELECT count(*) INTO V_TOTAL from Test_B;
IF (V_TOTAL>5) THEN
DELETE FROM test_state;
INSERT INTO test_state_bak (total_name) VALUES (V_TOTAL);
END IF;
END TRIGGER_STATE ;
/
wuxking 2003-08-19
  • 打赏
  • 举报
回复
同意 onejune4450(中文字符)的意见。
AFTER INSERT OR
DELETE OR
UPDATE OR
INSERT
怎么两个insert?
more_zou 2003-08-19
  • 打赏
  • 举报
回复
触发器体中的S Q L语句不能进行下列操作:
• 读或修改触发语句的任何变异表,其中包括触发表本身。
• 读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。除此之外的其他列
可以修改。
上述限制适用于所有的行级触发器。

解决该问题的方法是创建两个触发器,即一个行级触发器和一个语句级触发器。在行级触发器中,我们记录: n e w的值,但我们不查询变异表;而查询任务由语句级触发器来实现并使用行触发器记录的值。
onejune4450 2003-08-19
  • 打赏
  • 举报
回复
可能是TEST_B,test_state,test_state_bak 三个表的触发器有关联操作,请检查另外两个表的触发器。
skyxj 2003-08-19
  • 打赏
  • 举报
回复
触发器里对本表操作又会促发啊,呵呵,不合逻辑吧!
hdkkk 2003-08-18
  • 打赏
  • 举报
回复
触发器里不能对本表操作

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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