免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2008 | 回复: 11
打印 上一主题 下一主题

有一个关于触发器的设想,不知能否实现,请大家帮忙想想 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-17 08:42 |只看该作者 |倒序浏览
设想如下,有表A,目的是用触发器限定A表的记录条数,当A表插入条数大过1000条,自动删除最前面的记录,使A表一直保持1000条,请问有没有好的办法可以实现?
附上我当初写的Trigger代码:
---------------------------------------------------------------------------
create or replace trigger TG_A
  after INSERT OR UPDATE OR DELETE
                OF "USER_NAME","LOG_TIME"
                on A FOR EACH ROW
  
declare
  -- local variables here

  ROW_COUNT         NUMBER:=0;
  I                 NUMBER:=0;
  MAX_COUNT         NUMBER:=1000;

  cursor CUR_A is select USER_NAME,LOG_TIME,IP,ROWID from A;
begin
  SELECT COUNT(*) INTO ROW_COUNT FROM A;
  IF ROW_COUNT >; MAX_COUNT THEN
    FOR C_A IN CUR_A LOOP
      I:=I+1;
      IF I>;ROW_COUNT-MAX_COUNT THEN
        DELETE FROM A WHERE ROWID=C_A.ROWID;
        COMMIT;
      END IF;
    END LOOP;
  END IF;
      
end TG_A;
----------------------------------------------------------------------------

运行报ORA-04091错误。

论坛徽章:
0
2 [报告]
发表于 2004-06-17 11:06 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

为什么写的这么复杂呢?找到一个能够排序的列比如logtime,当插入一条新纪录时进行下列判断
select count(*) into sum from a;
if sum>;1000 then
delete from a where logtime=(select min(logtime) from a);

论坛徽章:
0
3 [报告]
发表于 2004-06-17 15:40 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

原帖由 "txfy" 发表:
为什么写的这么复杂呢?找到一个能够排序的列比如logtime,当插入一条新纪录时进行下列判断
select count(*) into sum from a;
if sum>;1000 then
delete from a where logtime=(select min(logtime) from a);

但是这样仅能删除一条记录而已,我之所以这么写,目的是我可以随时更改最大条数的限制,比如现在记录是1000条,但我还是觉得太多记录,就把限制数改成500,这样一旦有记录进行增加或改动,触发器会把前501条删除,使之实现记录最大条数为500的限制。不过还是要谢谢txfy。
希望诸位高手能帮想想看有什么好办法没有,这是小弟突发其想的一个想法。

论坛徽章:
0
4 [报告]
发表于 2004-06-17 16:00 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

你做的触发器是for each row的,所以每条都会触发,这样绝对不会超过你的阀值,至于阀值是多少你可以自己设定,我写的1000的地方你可以改成500,或者任意其他你想要得。

论坛徽章:
0
5 [报告]
发表于 2004-06-17 16:13 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

会吗?如果我一开始写的是1000,当插入第1001条记录时,你会删除第一条,但是我现在把1000改成500(之前已经有1000条记录了),那当插入第1001条记录时,你会删除前1条还是前501条呢?

论坛徽章:
0
6 [报告]
发表于 2004-06-17 17:07 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

昏,这个呀,哪不用if 改成loop until。

论坛徽章:
0
7 [报告]
发表于 2004-06-17 17:29 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

嗯,那就没问题。可是现在关键是我们怎样实现这样的Trigger啊?

论坛徽章:
0
8 [报告]
发表于 2004-06-17 20:31 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

[quote]原帖由 "Jerry.MF"]会吗?如果我一开始写的是1000,当插入第1001条记录时,你会删除第一条,但是我现在把1000改成500(之前已经有1000条记录了),那当插入第1001条记录时,你会删除前1条还是前501条呢?[/quote 发表:



你先手动删成500不就可以了吗?

一开始的初始化的事,就不用trigger了吧

论坛徽章:
0
9 [报告]
发表于 2004-06-18 09:24 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

这种类型的触发器我也在研究,刚刚查到资料,要创建两个触发器——一个行级触发器,一个是语句级触发器,才能实现对触发表的操作。具体怎么用我还没来得及测试呢,呵呵

论坛徽章:
0
10 [报告]
发表于 2004-06-18 18:20 |只看该作者

有一个关于触发器的设想,不知能否实现,请大家帮忙想想

原帖由 "rollingpig" 发表:



你先手动删成500不就可以了吗?

一开始的初始化的事,就不用trigger了吧

问题是我怎么知道他什么时候到了500条记录呢,若限制为50000呢?我总不可能一直监控住吧?尤其对一些日志表,有可能刷新速度很快的,手动删除真的不实际。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP