DBMS 中断言和触发器的区别
1. 什么是断言?
当一个约束涉及 2 个(或)更多的表时,表约束机制有时很难,结果可能不会如预期的那样。为了涵盖这种情况,SQL 支持创建断言,这些断言是不与一张表关联的约束。断言语句应确保数据库中始终存在某个条件。每当在相应的表中进行修改时,DBMS 总是检查断言。
语法:
CREATE ASSERTION [ assertion_name ]
CHECK ( [ condition ] );
示例:
CREATE TABLE sailors (sid int,sname varchar(20), rating int,primary key(sid),
CHECK(rating >= 1 AND rating <=10)
CHECK((select count(s.sid) from sailors s) + (select count(b.bid)from boats b)<100) );
在上面的例子中,我们执行了 CHECK
约束,船和水手的数量应该小于 100。所以这里可以同时 CHECK 两个平板电脑的约束。
2.什么是触发器?
触发器是与表关联的数据库对象,当对表执行定义的操作时,它将被激活。当我们运行以下语句时,可以执行触发器:
- INSERT
- UPDATE
- DELETE
它可以在事件之前或之后调用。
语法 –
create trigger [trigger_name]
[before | after]
{insert | update | delete}
on [table_name]
[for each row]
[trigger_body]
示例:
create trigger t1 before UPDATE on sailors
for each row
begin
if new.age>60 then
set new.age=old.age;
else
set new.age=new.age;
end if;
end;
$
在上面的示例中,我们在更新之前创建触发器。所以,如果新年龄大于 60 不应该更新,否则我们应该更新。可以使用 $
符号来调用这个触发器。
断言和触发器之间的区别:
编号 | 断言 | 触发器 |
---|---|---|
1 | 当知道给定的特定条件总是为真时,可以使用断言。 | 即使特定条件可能是也可能不是,可以使用触发器 |
2 | 当SQL条件不满足时,整个表甚至数据库都有可能被锁定。 | 如果查询条件不成立,触发器可以捕获错误。 |
3 | 断言没有链接到特定的表或事件。它执行用户指定或定义的任务。 | 它有助于维护数据库表中的完整性约束,尤其是在未定义主键和外键约束时。 |
4 | 断言不维护对表中所做更改的任何跟踪。 | 触发器跟踪表中发生的所有更改。 |
5 | 与触发器相比,断言的语法更小。 | 它们有很大的语法来指示创建的触发器的每一个特定的。 |
6 | 现代数据库不使用断言。 | 触发器在现代数据库中得到了很好的应用。 |
断言不能修改数据,它们不链接到数据库中的任何特定表或事件,但触发器更强大,因为它们可以检查条件并修改数据库内表中的数据,这与断言不同。