首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle -如何强制用户插入多行

Oracle -如何强制用户插入多行
EN

Stack Overflow用户
提问于 2014-04-22 15:21:02
回答 1查看 550关注 0票数 0

我正在使用Oracle11gR2进行一项学术作业。有一个限制,一个房间必须有3-5人。我知道我可以写一个这样的触发器来检查一个房间是否有超过5个人:

代码语言:javascript
复制
CREATE TABLE People
(
  PID INTEGER PRIMARY KEY
);

CREATE TABLE Room
(
  RID INTEGER PRIMARY KEY
);

CREATE TABLE Living
(
  RID INTEGER,
  PID INTEGER,
  CONSTRAINT Living_PK PRIMARY KEY (RID, PID),
  CONSTRAINT Living_FK_RID FOREIGN KEY (RID) REFERENCES Room(RID),
  CONSTRAINT Living_FK_PID FOREIGN KEY (PID) REFERENCES People(PID)
);

CREATE OR REPLACE TRIGGER Living_BIU
  BEFORE INSERT OR UPDATE ON Living
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW
DECLARE
  Count NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO Count
    FROM Living
    WHERE RID = :NEW.RID;
  IF(Count > 5)
  THEN
    RAISE_APPLICATION_ERROR(-20002, 'Too many people in a room.');
  END IF;
END Living_BI;

但是我不能检查这个数字是否小于3,因为我不能在生活中插入任何东西。因此,我的问题是,如何创建一个触发器,强制用户一次插入多于3行、少于5行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-22 15:39:03

标准的序言是,这并不是你在现实世界中真正做这种事的方式.

实际上,这里需要使用语句级触发器。如果你不介意每次检查每个房间的表现

代码语言:javascript
复制
CREATE OR REPLACE TRIGGER Living_AIUD
  AFTER INSERT OR UPDATE OR DELETE
  ON Living
DECLARE
  Count NUMBER;
BEGIN
  FOR x IN (SELECT rid, count(*) cnt
              FROM living
             GROUP BY rid
            HAVING COUNT(*) < 3)
  LOOP
    RAISE_APPLICATION_ERROR(-20002, 'Too few people in room ' || x.rid);
  END LOOP;
END Living_AIUD;

如果您不想每次检查每个房间,那么您需要一个包含rid值集合的包,一个初始化集合的前置语句触发器,以及一个将:new.rid值添加到集合中的行级触发器。您的after语句触发器随后将遍历集合中的元素,并检查仅这些房间中的人数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23223656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档