【问题标题】:Oracle database trigger before insert, reject invalid insertions but keep valid onesOracle 数据库在插入前触发,拒绝无效插入但保留有效插入
【发布时间】: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


【解决方案1】:

您可能需要查看 INSERT 语句的 LOG ERRORS 子句。

例如

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 子句。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多