【发布时间】:2014-03-08 14:24:26
【问题描述】:
我是oracle的新手,这里我尝试在插入之前写一个触发器。
在插入一个表之前,我从查询中获取值并根据这些值在其他表中搜索。如果我在其他表中找不到相关数据,那么插入应该会失败。
但我只想拒绝无效插入并保持有效。我试过提出一个错误,这会使整个交易失败。那我该怎么办?
CREATE OR REPLACE TRIGGER "SOME_TRIGGER"
BEFORE
INSERT ON "SOME_TABLE"
FOR EACH ROW
DECLARE
var_name VAR_TYPE;
BEGIN
SELECT COUNT(*) INTO var_name FROM OTHER_TABLE
WHERE OTHER_TABLE.SOME_COLUMN = :NEW.SOME_COLUMN;
IF (var_name < 1)
THEN
RAISE_APPLICATION_ERROR(-20001, 'ERR MESSAGE');
ELSE
NULL;
END IF;
END;
【问题讨论】:
-
好吧,那么您要么必须单独提交每个插入,这可能不是您想要的。这就是交易的全部意义——全有或全无。为什么不在调用应用程序中进行检查并让它过滤未通过验证的数据?建议你阅读Ask Tom's Trouble with Triggers
-
这听起来像你应该看看约束。通常这种类型的检查可以通过约束来实现。
-
您正在搜索的值是某种通用键,即
Primary Key?正如@steve 所指出的,这些类型的验证可以使用约束来实现。
标签: oracle database-design triggers oracle11g