任何人都可以帮助我编写一个触发器来禁止特定的表进入表(例如location ='chicago'不允许)。表模式如下department(deptno,deptname,location)。我正在使用Oracle 10g。plsql
plsql
回答
您可以使用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;
而不是DELETE,应该是RAISE_APPLICATION_ERROR(-20000,'请不要芝加哥!'); – jva 2009-08-24 09:50:38
整个触发器的东西根本就不需要..而在我的例子中(坏的)触发器是在... – 2009-08-24 10:12:59
触发器的缺点是你必须失败语句。通过检查约束,开发人员可以选择使用LOG ERRORS子句,以便插入有效数据并将无效数据放入异常表中。对批量数据加载非常有用。 – 2009-08-24 12:28:56
- 1. 猫PLSQL
- 2. 在PLSQL
- 3. 在PLSQL
- 4. 关于PLSQL
- 5. PLSQL读输入
- 6. PLSQL返回值
- 7. ORDER BY上PLSQL
- 8. PLSQL ORACLE COUNT
- 9. PLSQL嵌套表
- 10. 逸出PLSQL
- 11. 如何PLSQL
- 12. 如何PLSQL
- 13. 创建在PLSQL
- 14. Oracle/PLSQL性能
- 15. ORA-06550在PLSQL
- 16. Self加入PLSQL
- 17. PLSQL与Oracle 11g
- 18. PLSQL变量
- 19. PLSQL和循环
- 20. PLSQL中循环
- 21. PLSQL无效月份
- 22. PLSQL程序错误
- 23. PLSQL更新语句
- 24. PLSQL移动数据
- 25. C#和PlSql光标
- 26. PLSQL函数声明
- 27. PLSQL性能问题
- 28. PLSQL IS返回0
- 29. PLSQL变量插入
- 30. PLSQL搜索与VARCHAR2
这容易与存储过程来实现,但我不知道我把它放在那里是(除非你的开发人员直接在你的数据库上工作,并且你想限制他们,不太可能),但这些类型的业务约束通常是在代码中完成的,在数据库之上有很多层。 当然,我对你的代码或你的设计一无所知,只是一个评论... – Kobi 2009-08-24 09:40:09