在INSERT或Update之前触发plsql

时间:2009-08-24 07:05:35

标签: oracle plsql triggers

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

1 个答案:

答案 0 :(得分:11)

您可以使用列上的CHECK CONSTRAINT轻松完成所需的操作。

ALTER TABLE T
ADD CONSTRAINT constraint_name CHECK (location <> 'chicago') [DISABLE];
  

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

约束状态

  • ENABLE - 确保所有传入数据符合约束
  • DISABLE - 允许传入的数据,无论其是否符合约束
  • 有效 - 确保现有数据符合约束
  • 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来过滤它。 Here是关于数据完整性 - 约束和触发器的好文章。

  

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

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

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;