首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能阻止Oracle 11g上的触发器内插入吗?

我能阻止Oracle 11g上的触发器内插入吗?
EN

Stack Overflow用户
提问于 2014-06-15 20:39:43
回答 1查看 516关注 0票数 3

所以,如果满足条件,我要做的就是阻止插入。在这种情况下,我正在开发一个简单的库数据库系统,如果某个人已经借了两本书,但还没有归还一本书,我不想让他借到一本书。

我需要通过扳机来做这件事,有可能吗?此外,我还想知道是否可以像我一样向WHEN子句提供一个查询。

代码语言:javascript
复制
CREATE OR REPLACE TRIGGER trigger_borrowing_limit
BEFORE INSERT ON Borrowing
REFERENCING NEW ROW AS NROW
FOR EACH ROW
WHEN SELECT COUNT(*) FROM Borrowing WHERE RETURN_DATE IS NULL AND NROW.ID = Borrowing.ID > 2
BEGIN
?
END
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-15 21:32:06

不能为WHEN子句提供查询。从Oracle 11文档 (在到达页面后搜索"WHEN (条件)“):

对何时(条件)的限制

  • 如果指定此子句,则还必须为每一行指定。
  • 该条件不能包括子查询或PL/SQL表达式(例如,调用用户定义的函数)。

至于防止行插入,来自Mihai的注释是可行的。您的前端可以捕获异常,如果它是错误号-20101 (按照Mihai的示例),您就会知道这个人已经有两本书了。请注意,一些驱动程序将报告异常号的绝对值,因此到达您的错误号可能是20101

增编:后续问题询问如何应用“两本书出”逻辑,因为它对WHEN子句无效。

答案是删除WHEN子句并将逻辑放入触发器主体。注意,我通常坚持使用标准的NEW来引用新行,所以我的答案没有REFERENCING NEW AS NROW

代码语言:javascript
复制
CREATE OR REPLACE TRIGGER trigger_borrowing_limit
  BEFORE INSERT ON Borrowing
DECLARE
  booksOut NUMBER;
BEGIN
  SELECT COUNT(*) INTO booksOut
    FROM Borrowing
    WHERE RETURN_DATE IS NULL AND NEW.ID = Borrowing.ID;
  IF booksOut > 2 THEN
    -- Next line courtesy of Mihai's comment under the question
    raise_application_error(-20101, 'You already borrowed 2 books');
  END IF;
END;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24233915

复制
相关文章

相似问题

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