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

我是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;

您可能需要查看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;