有人能解释一下(或者推荐一个网站或论文),触发器(triggers)、断言(assertions)和检查(checks)之间的确切区别,并描述何时应该使用它们吗?
编辑:我指的是在数据库中,而不是其他任何系统或编程语言中。
有人能解释一下(或者推荐一个网站或论文),触发器(triggers)、断言(assertions)和检查(checks)之间的确切区别,并描述何时应该使用它们吗?
编辑:我指的是在数据库中,而不是其他任何系统或编程语言中。
触发器 - 触发器是在数据库中执行更新、插入或删除操作前后要执行的一条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语句,用于确保满足某个条件或停止对数据库对象进行操作。它可能意味着锁定整个表甚至整个数据库。
更加令人困惑的是 - 触发器可以用来执行检查约束,在某些数据库中可以取代断言(通过允许您运行与修改表无关的代码)。初学者常犯的一个错误是在需要触发器时使用检查约束,或者在需要检查约束时使用触发器。
例如:所有新客户开设账户必须有100美元的余额;然而,一旦账户开设成功,他们的余额可以低于该金额。在这种情况下,您必须使用触发器,因为您只想在插入新记录时评估条件。
断言并不修改数据,它们只检查特定的条件
触发器更加强大,因为它们可以检查条件并且可以修改数据
断言与数据库中的特定表格以及特定事件无关
触发器与特定的表格和特定的事件相关联
数据库约束是指在更新数据库时必须满足的条件。在SQL中,如果约束条件计算结果为假,则更新失败,数据保持不变,并且DBMS会生成错误。
CHECK
和ASSERTION
两者都是SQL标准定义的数据库约束。一个重要的区别是,CHECK
适用于特定的基本表,而ASSERTION
适用于整个数据库。考虑一个限制表T1
和T2
中行的合计数不超过10行的约束条件。例如:
CHECK (10 >= (
SELECT COUNT(*)
FROM (
SELECT *
FROM T1
UNION
SELECT *
FROM T2
) AS Tn
))
表达式必须为真才能触发,但如果表达式为假,检查将在任何地方进行评估。