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 现代数据库不使用断言。 触发器在现代数据库中得到了很好的应用。

断言不能修改数据,它们不链接到数据库中的任何特定表或事件,但触发器更强大,因为它们可以检查条件并修改数据库内表中的数据,这与断言不同。