plsql

2009-08-24 77 views
2

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

+1

这容易与存储过程来实现,但我不知道我把它放在那里是(除非你的开发人员直接在你的数据库上工作,并且你想限制他们,不太可能),但这些类型的业务约束通常是在代码中完成的,在数据​​库之上有很多层。 当然,我对你的代码或你的设计一无所知,只是一个评论... – Kobi 2009-08-24 09:40:09

回答

11

您可以使用CHECK CONSTRAINT在您的列上轻松做到您想要的。

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

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

约束美国

  • ENABLE - 确保所有输入数据是否符合约束
  • DISABLE - 允许传入的数据,不管它是否符合约束
  • VALIDATE - 确保现有数据符合con straint
  • NOVALIDATE - 现有的数据不必符合约束

这些可以组合使用

ENABLE {[默认] VALIDATE | NOVALIDATE}

DISABLE {VALIDATE | [默认] 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; 
+0

而不是DELETE,应该是RAISE_APPLICATION_ERROR(-20000,'请不要芝加哥!'); – jva 2009-08-24 09:50:38

+0

整个触发器的东西根本就不需要..而在我的例子中(坏的)触发器是在... – 2009-08-24 10:12:59

+1

触发器的缺点是你必须失败语句。通过检查约束,开发人员可以选择使用LOG ERRORS子句,以便插入有效数据并将无效数据放入异常表中。对批量数据加载非常有用。 – 2009-08-24 12:28:56