插入前的Oracle数据库触发器,拒绝无效插入但保留有效插入

时间:2014-02-11 00:58:35

标签: 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;
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;

1 个答案:

答案 0 :(得分:0)

您可能希望查看INSERT语句的LOG ERRORS子句。

e.g。

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;

看起来你也试图以编程方式实现外键约束。通过声明实现这一点要好得多。您可能希望查看CREATE TABLE语句的PRIMARY KEY和FOREIGN KEY子句。