+ -
当前位置:首页 → 问答吧 → 创建触发器 阻止用户删除那些已经被学生选修过的课程信息

创建触发器 阻止用户删除那些已经被学生选修过的课程信息

时间:2011-12-13

来源:互联网

成绩表中选过1号课程,当删除course表中的1号信息时就会进行阻止。而成绩表中没有5号课程,删除course表中的5号信息时不做提示

作者: milunda_halun   发布时间: 2011-12-13

作者: qianjin036a   发布时间: 2011-12-13

SQL code
create trigger tr_name on course 
 for delete
as
begin
     if exists(select 1 from 成绩表 where 课程id in(select 课程id from deleted))
      rollback
end

作者: ssp2009   发布时间: 2011-12-13

create trigger tr_delete_course 
on course 
for delete 
as 
set nocount on 
if exists (select from deleted where ) 
begin 
  RAISERROR ( '不能删除此记录 ') 
end 
go 

if那个地方开始条件我就不怎么会写了

作者: milunda_halun   发布时间: 2011-12-13

SQL code
create trigger delecourse
on course
INSTEAD OF delete
as
begin
if not exists(select 1 from 成绩表 a inner join deleted b on a.课程编号=b.课程编号)
delete from tb where 课程编号 in(select 课程编号 from deleted)
else
select '课程已选修,无法删除!'
end
go

作者: qianjin036a   发布时间: 2011-12-13

SQL code
create tigger test on course
for update,delete
as
begin
if exists(select 1 from score t where exists(select 1 from deleted where coursename=t.coursename))
print '存在信息,不允许删除'
end

作者: fredrickhu   发布时间: 2011-12-13

用 INSTEAD OF 触发器是最合适的.因为删除操作还没有开始.

像2楼那样用for 触发器,操作过程是:先删除,再检查,发现不对,再加滚---很有些多此一举的意思.
像5楼那样,更不行了,因为根本就没有回滚,仍然被删除了.

不过 4 楼只写了delete触发器,如果要加 update,也可以,但程序要改一下.

作者: qianjin036a   发布时间: 2011-12-13

SQL code

if object_id('课程表') is not null
   drop table 课程表
go
create table 课程表
(
 课程id int,
 课程名称 varchar(10)
)
go
insert into 课程表
select 1,'语文' union all
select 5,'数学'
go
--删除触发器
if object_id('tr_课程表_del') is not null
   drop trigger tr_课程表_del
go
create trigger tr_课程表_del on 课程表
for delete
as
  if exists(select 1 from 成绩表 a inner join deleted b on a.课程id=b.课程id)
  begin
    rollback
    print '成绩表中存在,不允许删除'
  end
go
if object_id('成绩表') is not null
   drop table 成绩表
go
create table 成绩表
(
 学生id int,
 课程id int,
 分数 int
)
go
insert into 成绩表
select 1,1,60

delete 课程表 where 课程id=1  --删除终止,提示信息
delete 课程表 where 课程id=5  --删除成功,没有提示信息

select * from 课程表

作者: pengxuan   发布时间: 2011-12-13