📄 用触发器来实现数据的完整性.sql
字号:
-- 一、用触发器来实现用户自定义完整性
select * from employee
update employee
set salary=salary/10
select * from employee
update employee
set salary=4500
where salary>5000
select * from employee
--如果要在salary上定义一个完整性约束,
--限定其取值不能超过5000,有以下几种作法:
--1、在employee表的salary列上建有核查约束(salary<=5000),
--执行以下语句系统将会报错。
insert employee values('E0021','林正','男','管理','总经理','1974-10-01','1953-05-04',60000,'13879765667','上海市')
--2、如果不建核查约束,则可以定义AFTER类型的触发器,
--当插入记录的salary值超过5000,则回滚插入操作,不会出现系统报错。
create trigger emp_insert1
on employee
after insert
as
if (select salary from inserted)>5000
begin
print '新员工的工资不能超过5000!!!'
rollback
end
insert employee values('E0021','林正','男','管理','总经理','1974-10-01','1953-05-04',60000,'13879765667','上海市')
--3、不管在salary上是否建有核查约束,可以通过建instead of的触发器,来实现数据的完整性
create trigger emp_insert
on employee
instead of insert
as
if (select salary from inserted)>5000
print '新员工的工资不能超过5000'
else
insert into employee
select * from inserted
--再次执行以上插入语句,则该触发器在INSERT操作之前被触发,
--通过执行触发器定义的操作来取代INSERT命令。不致于出现系统报错。
insert employee values('E0021','林正','男','管理','总经理','1974-10-01','1953-05-04',60000,'13879765667','上海市')
--二、用触发器来实现参照完整性
select * from sales
--在sales 表中建一外键约束,sale_id参照employee表中的emp_no
--(没有选级联删除和级联修改)
delete employee
where emp_no='E0008'
--执行以上语句系统报错。
--若在建外键约束时选择了级联删除和级联修改,
--则在删除employee表的同时,会把sales表中的相应记录一并删除。
delete employee
where emp_no='E0008'
--若没有建外键约束,或者建了(不管有没有选级联删除和级联修改),
--都可以通过对EMPLOYEE表建instead of delete的触发器来实现。
create trigger emp_delete
on employee
instead of delete
as
delete sales where sale_id =(select emp_no from deleted)
delete employee where emp_no =(select emp_no from deleted)
delete employee
where emp_no='E0008'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -