「例]完整性定义及参照完整性的违约处理示例 CREATE TABLE SC Sno CHar(9) NOT NULL Cno CHAR(4)NOT NULL, Grade smaLlint cheCK(Grade>=0 AND Grade <=100), PRIMARY KEY(Sno, Cno) FOREIGN KEY(Sno) REFERENCES Student(Sno) ON DELETE CASCADE级联删除SC表中相应的元组* ON UPDATE CASCADE.,/级联更新SC表中相应的元组 FOREIGN KEY(Cno) REFERENCES Course(Cno ON DELETE NO ACTION /当删除 course表中的元组造成了与SC表不一致时拒绝删除* ON UPDATE CASCADE 当更新 course表中的cno时,级联更新SC表中相应的元组 )
11 [例] 完整性定义及参照完整性的违约处理示例 CREATE TABLE SC ( Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT CHECK (Grade>=0 AND Grade <=100), PRIMARY KEY(Sno,Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE /*级联删除SC表中相应的元组*/ ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE NO ACTION /*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/ ON UPDATE CASCADE /*当更新course表中的cno时,级联更新SC表中相应的元组*/ );
触发器 触发器可以实施更为复杂的完整性检查和操作 触发器模型:事件一条件—动作模型 触发器一经定义,将被存储在数据库中 当对数据库修改时,触发器自动被系统执行
12 触发器 触发器可以实施更为复杂的完整性检查和操作 触发器模型:事件—条件—动作模型 触发器一经定义,将被存储在数据库中 当对数据库修改时,触发器自动被系统执行
学分管理 create trigger credits earned after update of takes on(grade referencing new row as nrow referencing old row as orow for each row and (orowgrade='F'or orow grade is null)ull when nrow grade <> ' and nrow grade is not begin atomic update student set tot cred- tot cred+ (select credits from course where course. course id= nrow course id) where student id=nrow id ent nd
13 学分管理 create trigger credits_earned after update of takes on (grade ) referencing new row as nrow referencing old row as orow for each row when nrow.grade <> ’F’ and nrow.grade is not null and (orow.grade = ’F’ or orow.grade is null ) begin atomic update student set tot_cred= tot_cred + (select credits from course where course.course_id= nrow.course_id) where student.id = nrow.id; end;
完整性约束可能被破坏的原因 故障引起的(软件、硬件、网络、恶意破环等) 数据共享引起的(多用户,事务并发) 怎样避免/恢复被破坏的完整性? 由故障引起的问题一一数据库恢复 由数据共享引起的问题一一并发控制
14 完整性约束可能被破坏的原因 故障引起的(软件、硬件、网络、恶意破环等) 数据共享引起的(多用户,事务并发) 怎样避免/恢复被破坏的完整性? 由故障引起的问题--数据库恢复 由数据共享引起的问题--并发控制
数据库不可能在任何时候都保持一致,一致性是基于事务的 例如:在一个账户管理数据库中,存在约束: al +a2 +. an=tot, 往a2账户中存款100元的操作: a2 <a2+100, TOT TOT+100 a2 50 150 150 TOT1000 1000 1100 这个时刻数据库不一致
a2 TOT . . 50 . . 1000 . . 150 . . 1000 . . 150 . . 1100 这个时刻数据库不一致 • 数据库不可能在任何时候都保持一致,一致性是基于事务的。 • 例如: 在一个账户管理数据库中,存在约束: a1 + a2 +…. an = TOT, 往a2账户中存款100元的操作: a2 ← a2 + 100,TOT ← TOT + 100 15