加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer中触发器的使用

发布时间:2020-12-12 14:53:04 所属栏目:MsSql教程 来源:网络整理
导读:--案例表USE stuDB GOCREATE TABLE stuInfo(stuName varchar(20) not null,stuNo char(6) PRIMARY KEY,stuAge int not null check(stuAge0 and stuAge100),stuID varchar(18) not null,stuSeat int identity(1,1),stuAddress varchar(50) default '住址不详'
--案例表
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','421990198909111278' union
select '5','010005','421990198909114556' union
select '6','010006','421990198909117845' union
select '7','010007',24,'421990198909112345' union
select '8','010008',20,'421990198909117457' union
select '9','010009','421990198909111557' union
select '蒋雯丽','010010','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',58,68 union
	select '09002',66,77 union
	select '09003',86,45 union
	select '09004',62,62 union
	select '09005',67,54 union
	select '09006',78,69 union
	select '09007',60,83 union
	select '09008',48,74 union
	select '09009',54,69 union
	select '09010',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','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('不允许删除指定的学员信息',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,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('成绩字段不能为更新',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,stuid) 
	values('AAA','001','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

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读