gpt4 book ai didi

oracle - 在 INSERT 或 Update 触发 plsql 之前

转载 作者:行者123 更新时间:2023-12-02 06:12:10 26 4
gpt4 key购买 nike

谁能帮我写一个触发器来禁止特定条目进入表(例如 location = 'chicago' 不允许)。表架构如下部门(deptno,deptname,location)。我正在使用 oracle 10g。

最佳答案

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

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

The DISABLE keyword is optional. If you create a check constraint using the DISABLE keyword, the constraint will be created, but the condition will not be enforced.

约束状态

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

这些可以组合使用

启用{ [默认] 验证 |更新

DISABLE { VALIDATE |[默认] NOVALIDATE }

  • ENABLE VALIDATE 与 ENABLE 相同。

  • ENABLE NOVALIDATE 表示检查约束,但不必对所有行都为真。这将恢复对禁用约束的约束检查,而无需首先验证表中的所有数据。

  • DISABLE NOVALIDATE 与 DISABLE 相同。

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

这是 BEFORE INSERT 触发器的示例。但是,最好在您的架构上创建约束或实现 CUSTOM_INSERT PROCEDURE,以对其进行过滤。 Here是一篇关于数据完整性 - 约束和触发器的好文章。

Triggers should not be used to enforce business rules or referential integrity rules that could be implemented with simple constraints.

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

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;

关于oracle - 在 INSERT 或 Update 触发 plsql 之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1320848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com