SqlServer中触发器的使用

--案例表
USE stuDB 
GO
CREATE  TABLE  stuInfo
(
stuName  varchar(20)  not null ,
stuNo   char(6)  PRIMARY KEY,
stuAge  int not null check(stuAge>0 and stuAge<100), 
stuID  varchar(18) not null, 
stuSeat   int identity(1,1),
stuAddress   varchar(50) default '住址不详'
)
GO
insert into stuInfo(stuName,stuNo,stuAge,stuId)
select '1','010001',21,'421990198909112311' union
select '2','010002',22,'421990198909111342' union
select '3','010003',23,'421990198909111242' union
select '4','010004',21,'421990198909111278' union
select '5','010005',22,'421990198909114556' union
select '6','010006',23,'421990198909117845' union
select '7','010007',24,'421990198909112345' union
select '8','010008',20,'421990198909117457' union
select '9','010009',22,'421990198909111557' union
select '蒋雯丽','010010',20,'421990198909111905' 
go
CREATE TABLE stuMarks
(
ExamNo  CHAR(7)  primary key,
stuNo  CHAR(6)  NOT NULL references stuInfo(stuNo),
writtenExam  INT  NOT NULL,
LabExam  INT  NOT NULL
)
GO
insert into stuMarks
	select '09001','010001',58,68 union
	select '09002','010002',66,77 union
	select '09003','010003',86,45 union
	select '09004','010004',62,62 union
	select '09005','010005',67,54 union
	select '09006','010006',78,69 union
	select '09007','010007',60,83 union
	select '09008','010008',48,74 union
	select '09009','010009',54,69 union
	select '09010','010010',61,55 

--创建登录触发器
--限制sa用户只能登陆3次
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'sa' AND
    (SELECT COUNT(*) FROM sys.dm_exec_sessions
            WHERE is_user_process = 1 AND
                original_login_name = 'sa') > 3
    ROLLBACK;
END;

use BOOK
go
create trigger create_trigger
on database
for create_table
as
	print '正在创建表'
go

--禁止用户删除和修改表
use BOOK
go
create trigger deny_drop_table
on database
for drop_table,alter_table
as
begin
	print '不允许删除和修改表'
	rollback tran
end
--测试触发器
alter table test add tname varchar(20) not null
--禁用DDL触发器
disable trigger 触发器名 on all server
disable trigger 触发器名 on database
--启用DDL触发器
enable trigger 触发器名 on all server
enable trigger 触发器名 on database
--删除DDL触发器
drop trigger 触发器名 on all server
drop trigger 触发器名 on database

--after insert触发器
select * from stuinfo
select * from stumarks
--限制用户插入年龄》30 或《18的信息
--删除触发器
drop trigger check_insert_stuinfo

create trigger check_insert_stuinfo
on stuinfo
for insert
as
begin
	declare @age int
	--获取当前用户插入的数据
	select @age=stuage from inserted
	--判断年龄信息
	if @age>30 or @age<18
	begin
		raiserror('年龄数据必须在18-30之间',16,1)
		rollback tran
	end
end

--测试触发器
insert into stuinfo(stuname,stuno,stuage,stuid,stuaddress)
	values('CCC','010014',22,'555666',default)
SELECT * FROM STUINFO

--After delete触发器
--禁止用户删除信息
create trigger deny_delete_stuinfo
on stuinfo
for delete
as
begin
	declare @name varchar(20)
	select @name=stuname from deleted
	if @name='李斯文' or @name='梅超风'
	begin
		raiserror('不允许删除指定的学员信息',16,1)
		rollback tran
	end
end

--备份删除的信息
--创建备份表
select * into StuBak from stuinfo where 1=2
	--删除列stuseat
	alter table stubak drop column stuseat
	--添加列stuseat
	alter table stubak add stuseat int 

--创建触发器
create trigger delete_bak_stuinfo
on stuinfo
for delete
as
	insert into stubak(stuname,stuno,stuage,stuid,stuseat,stuaddress) select * from deleted

--测试	
delete from stuinfo where stuage>30
select * from stubak


--After update触发器
create trigger update_stumarks
on stumarks
for update
as
begin
	--如何判断有没有更新writtenEXAM和labExam
	if update(writtenExam) or update(labExam)
	begin
		raiserror('成绩字段不能为更新',16,1)
		rollback tran
	end
end
--测试触发器
update stumarks set labexam=labexam+10

--日志审计
create table tb_log
(
	log_id int identity(1,1) primary key,
	username varchar(20) not null,
	log_date datetime,
	log_desc varchar(100)
)
create trigger log_trigger
on stuinfo
for insert,delete,update
as
	--获取当前登录用户
	declare @name varchar(20)
	set @name=ORIGINAL_LOGIN()
	--获取当前操作时间
	declare @date datetime
	set @date=getdate()
	declare @desc varchar(100)
	if exists(select * from inserted) and not exists(select * from deleted)
	set @desc='插入数据'
	else if(exists(select * from deleted) and not exists(select * from inserted))
	set @desc='删除数据'
	else
	set @desc='修改数据'
	insert into tb_log values(@name,@date,@desc)
go

insert into StuInfo(stuname,stuno,stuage,stuid) 
	values('AAA','001',21,'123456')
select * from tb_log

--instead of触发器
create table stu
(
	sid int,
	sname varchar(20)
)
create table computer
(
	sid int,
	marks float
)
insert into stu values(1,'AAA')
insert into stu values(2,'BBB')
insert into stu values(3,'CCC')

insert into computer values(1,'60')
insert into computer values(2,'70')
insert into computer values(3,'80')
select * from stu
select * from computer
--创建视图
create view view_stu_computer
as
	select stu.sid,sname,marks from stu,computer
	where stu.sid=computer.sid
go
--查询视图
--视图基于一张表创建,可以对视图实施增、删、改操作
--视图基于多张表创建,不允许对视图实施。。。(在视图上创建instead of触发器)
select * from view_stu_computer
insert into view_stu_computer values(4,'DDD',90)
delete from view_stu_computer where sid=4

create trigger insert_view_stu_computer
on view_stu_computer
instead of insert
as
	--从inserted表中获取插入的数据
	declare @id int,@name varchar(20),@marks float
	select @id=sid,@name=sname,@marks=marks from inserted
	--向基表中插入数据
	insert into stu values(@id,@name)
	insert into computer values(@id,@marks)
go

create trigger delete_view_stu_computer
on view_stu_computer
instead of delete
as
	--从deleted表中获取正在删除的编号
	declare @id int
	select @id=sid from deleted
	--从基表删除数据
	delete from computer where sid=@id
	delete from stu where sid=@id
go


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值