触发器,断言和检查之间有什么区别(在数据库中)

时间:2010-03-14 18:56:52

标签: sql database triggers assertions

任何人都可以解释(或建议网站或论文)触发器,断言和检查之间的确切区别,还可以描述我应该在哪里使用它们吗?

编辑:我的意思是在数据库中,而不是在任何其他系统或编程语言中。

5 个答案:

答案 0 :(得分:55)

触发器 - 触发器是在数据库中更新,插入或删除之前或之后执行的一段SQL。简单英语触发器的示例可能类似于:在更新客户记录之前,保存当前记录的副本。这看起来像是:

CREATE TRIGGER triggerName
AFTER UPDATE
    INSERT INTO CustomerLog (blah, blah, blah)
    SELECT blah, blah, blah FROM deleted

断言和检查之间的区别更加模糊,许多数据库甚至不支持断言。

检查约束 - 检查是一段SQL,它确保在对记录执行操作之前满足条件。简单来说,这就是:所有客户的账户余额必须至少为100美元。这看起来像是:

ALTER TABLE accounts 
ADD CONSTRAINT CK_minimumBalance
CHECK (balance >= 100)

任何在平衡列中插入小于100的值的尝试都会引发错误。

断言 - 断言是一段SQL,它确保满足条件或停止对数据库对象采取的操作。这可能意味着锁定整个表甚至整个数据库。

使问题更加混乱 - 可以使用触发器来强制执行检查约束,并且在某些DB中可以取代断言(允许您运行与正在修改的表无关的代码)。初学者的一个常见错误是在需要触发器时使用检查约束,或者在需要检查约束时使用触发器。

一个例子:所有开户的新客户必须有100美元的余额;但是,一旦开立账户,其余额可能会低于该金额。在这种情况下,您必须使用触发器,因为您只希望在插入新记录时评估条件。

答案 1 :(得分:11)

答案 2 :(得分:6)

断言不会修改数据,只会检查某些条件

触发器功能更强大,因为它可以检查条件并修改数据

----------------------------------------------- ---------------------------------

断言没有链接到数据库中的特定表,也没有链接到特定事件

触发器链接到特定表和特定事件

答案 3 :(得分:1)

数据库约束涉及更新数据库时必须满足的条件。在SQL中,如果约束条件的计算结果为false,则更新失败,数据保持不变,DBMS会生成错误。

CHECKASSERTION都是SQL标准定义的数据库约束。一个重要的区别是CHECK应用于特定基表,而ASSERTION应用于整个数据库。考虑将表T1T2中的组合行限制为总共10行的约束,例如

CHECK (10 >= (
              SELECT COUNT(*)
                FROM (
                      SELECT *
                        FROM T1
                      UNION
                      SELECT * 
                        FROM T2
                     ) AS Tn
             ))

假设表格为空。如果仅作为ASSERTION应用,并且用户尝试在T1中插入11行,则更新将失败。如果约束仅作为CHECK约束应用于T1,则同样适用。但是,如果约束作为CHECK约束应用于T2,则只有约束才会成功,因为定位T1的语句不会导致应用于T1的约束被测试

ASSERTIONCHECK都可以延迟(如果声明为DEFERRABLE),允许数据暂时违反约束条件,但仅限于事务中。

涉及子查询的

ASSERTIONCHECK约束是核心标准SQL之外的功能,并且所有主要SQL产品都不支持这些功能。 MS Access(不完全是工业级产品)支持涉及子查询的CHECK约束但不是可延迟约束加上约束测试总是逐行执行,实际结果是功能非常有限。

CHECK约束一样,触发器应用于特定表。因此,触发器可用于实现与CHECK约束相同但不是ASSERTION的逻辑。触发器是过程代码,与约束不同,用户必须对性能和错误处理等问题承担更多责任。大多数商业SQL产品都支持触发器(前面提到的MS Access没有)。

答案 4 :(得分:0)

对于触发器触发,表达式应为true,但只要表达式为false,就会计算检查。