任何人都可以解释(或建议网站或论文)触发器,断言和检查之间的确切区别,还可以描述我应该在哪里使用它们吗?
编辑:我的意思是在数据库中,而不是在任何其他系统或编程语言中。
答案 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会生成错误。
CHECK
和ASSERTION
都是SQL标准定义的数据库约束。一个重要的区别是CHECK
应用于特定基表,而ASSERTION
应用于整个数据库。考虑将表T1
和T2
中的组合行限制为总共10行的约束,例如
CHECK (10 >= (
SELECT COUNT(*)
FROM (
SELECT *
FROM T1
UNION
SELECT *
FROM T2
) AS Tn
))
假设表格为空。如果仅作为ASSERTION
应用,并且用户尝试在T1
中插入11行,则更新将失败。如果约束仅作为CHECK
约束应用于T1
,则同样适用。但是,如果约束作为CHECK
约束应用于T2
,则只有约束才会成功,因为定位T1
的语句不会导致应用于T1
的约束被测试
ASSERTION
和CHECK
都可以延迟(如果声明为DEFERRABLE
),允许数据暂时违反约束条件,但仅限于事务中。
ASSERTION
和CHECK
约束是核心标准SQL之外的功能,并且所有主要SQL产品都不支持这些功能。 MS Access(不完全是工业级产品)支持涉及子查询的CHECK
约束但不是可延迟约束加上约束测试总是逐行执行,实际结果是功能非常有限。
与CHECK
约束一样,触发器应用于特定表。因此,触发器可用于实现与CHECK
约束相同但不是ASSERTION
的逻辑。触发器是过程代码,与约束不同,用户必须对性能和错误处理等问题承担更多责任。大多数商业SQL产品都支持触发器(前面提到的MS Access没有)。
答案 4 :(得分:0)
对于触发器触发,表达式应为true,但只要表达式为false,就会计算检查。