在INSERT或Update之前触发plsql

wan*_*eek 2 oracle triggers plsql

任何人都可以帮助我编写一个触发器来禁止特定的进入表格(例如,不允许使用location ='chicago').表模式如下(deptno,deptname,location).我正在使用oracle 10g.

Sve*_*lov 11

您可以使用列上的CHECK CONSTRAINT轻松执行所需操作.

ALTER TABLE T
ADD CONSTRAINT constraint_name CHECK (location <> 'chicago') [DISABLE];
Run Code Online (Sandbox Code Playgroud)

DISABLE关键字是可选的.如果使用DISABLE关键字创建检查约束,则将创建约束,但不会强制执行该条件.

约束国

  • ENABLE - 确保所有传入数据符合约束
  • 禁用 - 允许传入数据,无论它是否符合约束
  • VALIDATE - 确保现有数据符合约束
  • NOVALIDATE - 现有数据不必符合约束

这些可以组合使用

ENABLE {[default] VALIDATE | NOVALIDATE}

DISABLE {VALIDATE | [default] NOVALIDATE}

  • ENABLE VALIDATE与ENABLE相同.

  • ENABLE NOVALIDATE表示已检查约束,但不必对所有行都为true.这将在不首先验证表中的所有数据的情况下恢复对禁用约束的约束检查.

  • DISABLE NOVALIDATE与DISABLE相同.

  • DISABLE VALIDATE禁用约束,删除约束上的索引,并禁止对受约束列进行任何修改.对于UNIQUE约束,这使您可以使用ALTER TABLE .. EXCHANGE PARTITION子句将数据从非分区表加载到分区表中.

以下是BEFORE INSERT触发器的示例.但是,最好在模式上创建约束或实现CUSTOM_INSERT PROCEDURE来过滤它.是一篇关于数据完整性 - 约束和触发器的好文章.

不应使用触发器来强制执行可以使用简单约束实现的业务规则或参照完整性规则.

示例触发器(将其视为过滤输入的一个坏主意):

CREATE TRIGGER myTrigger 
BEFORE INSERT
ON table
REFERENCING NEW AS New
FOR EACH ROW
   BEGIN
   IF (New.location = 'chicago') THEN
       RAISE cError;    
EXCEPTION
WHEN cError THEN
      RAISE_APPLICATION_EXCEPTION(-20001,'Chicago is not allowed');
END;
Run Code Online (Sandbox Code Playgroud)