《触发器》练习1、设计一个简单的AFTER INSERT触发器,这个触发器的作用是:在插入一条记录的时候,发出“又添加了一个学生的成绩”的友好提示。
CREATE TRIGGER score_insertON scoreAFTER INSERTASBEGINPRINT '又添加了一个学生的成绩'ENDGO2、设计一个简单的AFTER UPDATE触发器,这个触发器的作用是:在修改一条记录的时候,发出“又修改了一个学生的成绩”的友好提示。
CREATE TRIGGER score_updateON scoreAFTER UPDATEASBEGINPRINT '又修改了一个学生的成绩'ENDGO3、设计一个简单的AFTER DELETE触发器,这个触发器的作用是:在删除一条记录的时候,发出“又删除了一个学生的成绩”的友好提示。
CREATE TRIGGER score_deleteON scoreAFTER DELETEASBEGINPRINT …又删除了一个学生的成绩'ENDGO5、在score表上创建一个instead of insert触发器,实现:当向表score 插入记录时检查分数的合理性,如果不合理就不进行插入操作,否则允许。
create trigger score_insert_insteadon scoreinstead of insertasbeginset nocount ondeclare @sname varchar(10),@chinese int,@maths int,@english intselect@sname=sname,@chinese=chinese,@maths=maths,@english=english from insertedif(@chinese<0 or @chinese>100 or @maths<0 or @maths>100 or @english<0 or @english>100)print '分数不合理'elseinsert into score values(@sname,@chinese,@maths,@english)end6、在score表上创建一个instead of delete触发器,实现:当从表score 删除记录时检查各课程的成绩是否为空,如果为空就不允许进行删除操作,否则允许。
create trigger score_delete_insteadon scoreinstead of deleteasbeginset nocount ondeclare @sname varchar(10),@chinese int,@maths int,@english int select@sname=sname,@chinese=chinese,@maths=maths,@english=english from deletedif(@chinese is null or @maths is null or @english is null)print '成绩为空,不能删除该记录'elsedelete from score where sname=@sname7、在score表上创建一个instead of update触发器,实现:当从表score 更新记录时检查当前用户是否是dbo,如果不是dbo就不允许进行更新操作,否则允许。
create trigger score_update_insteadon scoreinstead of updateasbeginset nocount ondeclare @sname1 varchar(10),@sname2 varchar(10),@current_user varchar(10)select @sname1=sname from insertedselect @sname2=sname from deletedif(current_user !='dbo')print '不是dbo用户不能修改学生姓名信息'elseupdate score set sname=@sname1 where sname=@sname2end8、在视图v_score创建一个instead of insert触发器,实现:从视图v_score插入记录时,提示…从视图v_score插入一条记录‟。
create trigger v_score_inserton v_scoreinstead of insertasbegininsert into score select * from insertedprint ‘从视图v_score插入了一条记录'end9、建立一个DDL触发器,用于保护数据库中的数据表不被修改,不被删除。
CREATE TRIGGER 禁止对数据表操作ON DATABASEFOR DROP_TABLE, ALTER_TABLEASPRINT '对不起,您不能对数据表进行操作'ROLLBACK10、建立一个DDL触发器,用于保护当前SQL Server服务器里所有数据库不能被删除。
CREATE TRIGGER 不允许删除数据库ON all serverFOR DROP_DATABASEASPRINT '对不起,您不能删除数据库'ROLLBACK11、现在,在demodb数据库里建一个操作记录表,用来记录所有数据表的操作,无论是对哪个数据表进行了插入、更新或删除,都可以把操作内容和操作时间记录到操作记录表里。
操作记录表(编号int identity(1,1) NOT NULL,操作表名varchar(50) NOT NULL,操作语句varchar(2000) NOT NULL,操作内容varchar(2000) NOT NULL,操作时间datetime NOT NULLCONSTRAINT DF_操作记录表_操作时间DEFAULT (getdate()))类别(类别名称varchar(20),类别说明varchar(30))CREATE TRIGGER 操作记录表_InsertON 操作记录表AFTER INSERTASBEGINPRINT '数据库又有记录变动了'ENDCREATE TRIGGER 类别_InsertON 类别AFTER INSERTASBEGINDeclare@类别名称nvarchar(15),@说明nvarchar(max)set @类别名称=(select 类别名称from inserted)set @说明= (Select 类别说明from inserted)INSERT INTO 操作记录表(操作表名,操作语句,操作内容)V ALUES('类别表','插入记录','类别名称:'+@类别名称+',说明:'+@说明)END12、给score表创建一个after insert触发器,实现:当向score插入记录时,提示‘向score表插入了内容为:…的记录’,也就是把插入表中的记录信息显示出来。
(例“向score表插入了内容为:张丽,80,90,70的记录”)13、给score表创建一个after insert触发器,实现:更新score表时,提示‘把score表内容为:…的记录更新为:…’,也就是把更新表中的记录信息显示出来。
(例“把score表内容为:张丽,80,90,70的记录更新为:张丽,80,90,90”)14、给score表创建一个after delete触发器,实现:当向score删除记录时,提示‘从score表删除了内容为:…的记录’,也就是把删除的记录信息显示出来。
(例“从score表删除内容为:张丽,80,90,70的记录”)15、给sell表创建一个after insert 触发器,实现:当向sell插入一条记录时,修改stock表中的stock_amount(库存数量),值等于stock_amount-sell_amount,还有修改时间modified_date,并显示相应的提示信息:“库存量还剩余stock_amount-sell_amount”,当(stock_amount-sell_amount)<0时,不允许进行插入操作,即操作回滚,并显示相应的提示信息:“库存量不足,只有stock_amount”。
附stock、sell表信息stock(prod_id char(10),prod_name varchar(10),unit_price int,stock_amount int,modified_date datetime)sell(order_id int identity(1,1),prod_id char(10),sell_amount int,sell_date datetime,Saler varchar(10))16、在sell表中创建一个instead of insert触发器,实现15题的功能。
17、在stock表中创建一个after delete触发器,实现:当删除stock 表中记录时,如果记录的stock_amount不为零,则记录不能删除,即操作回滚,并显示提示信息:“库存量不为零,记录不能删除”,否则显示提示信息:“记录删除了”。