Oracle数据库触发器在插入之前,拒绝无效的插入,但保留有效的插入
我是oracle的新手,这里我尝试在插入之前编写触发器 在插入一个表之前,我从查询中获取值,并根据这些值搜索其他表。如果在其他表中找不到相关数据,那么插入应该失败 但我只想拒绝无效的插入,并保持它们是有效的。我试图提出一个错误,这将使整个交易失败。那我该怎么办Oracle数据库触发器在插入之前,拒绝无效的插入,但保留有效的插入,oracle,database-design,triggers,oracle11g,Oracle,Database Design,Triggers,Oracle11g,我是oracle的新手,这里我尝试在插入之前编写触发器 在插入一个表之前,我从查询中获取值,并根据这些值搜索其他表。如果在其他表中找不到相关数据,那么插入应该失败 但我只想拒绝无效的插入,并保持它们是有效的。我试图提出一个错误,这将使整个交易失败。那我该怎么办 CREATE OR REPLACE TRIGGER "SOME_TRIGGER" BEFORE INSERT ON "SOME_TABLE" FOR EACH ROW DECLARE var_name VAR_TYPE; BEGI
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;
您可能需要查看INSERT语句的LOGERRORS子句 e、 g
看起来您还试图以编程方式实现外键约束。最好通过一项声明来实现这一点。您可能需要查看CREATE TABLE语句的主键和外键子句。那么,您要么必须单独提交每个插入,这可能不是您想要的。这就是交易的全部要点——要么全有,要么全无。为什么不改为在呼叫应用程序中进行检查,并让它过滤未通过验证的数据?建议您阅读这篇文章,听起来您应该看看约束。通常,这种类型的检查可以通过约束来实现。您正在搜索的值是某种公共键,即主键?正如@steve所指出的,这些类型的验证可以使用约束来实现。
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('some_table', 'some_table_errors');
INSERT INTO some_table
SELECT some_column
FROM other_table
LOG ERRORS INTO some_table_errors('my_errors') REJECT LIMIT UNLIMITED;