SQL Server 2005系列教学(16) 触发器

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
触发器:
本质是一个存储过程
常见的触发器类型:
插入触发器  insert
删除触发器  delete 
更新触发器  update
插入触发器:
语法:
create trigger 名称
on 表名  for insert
as
begin
   代码
end

select  * from users
insert into users values ('张三','男',20,40)
例:禁止插入新记录
alter trigger inse01
on users for insert
as
begin
  if exists( select  * from  inserted)   或者写成 count(*)
    rollback
   print '禁止插入新员工信息'
end
insert into users values ('张三风','男',20,40)
select  * from users
--simpletrigger.sql
--简单的触发器
use northwind
例:
alter trigger 简单触发器 on dufei for insert as 
declare @ID int,@username nvarchar(50)
set @ID = @@identity
set @username = (select username from dufei where  ID=@ID)
print '最后写入的记录的编号是:' + convert(nvarchar,@ID) + '  用户名是:' + @username
go
insert dufei (username) values('吴小华')
但如果在print 后加一个rollback结果就不同了。说明是手插入到表中了,但又回滚了。
select @@identity
create table dufei
(id  int identity(1,1),
username varchar(10))

--drop trigger reminder
insert into employees(LastName,FirstName)
values('hahaha1','xixixi1')
select * from employees
--禁止触发器
alter table employees disable trigger reminder
 
--启用触发器
alter table employees enable trigger reminder
select * from employees
解除触发器:(删除触发器)
drop trigger 名称
drop trigger inse01

禁止插入行政部新员工
alter trigger inse02
on yuangong for insert
as
begin
if exists(select * from inserted where 部门='行政部' )
begin
  rollback
  print  '你的权限不够,不能插入行政部新员工!'
end
end
select  * from yuangong
delete from yuangong  where 姓名='于洋'
insert into yuangong values  ('0001','于洋','男',20,'2007-12-26','河南',3000,2000,500,1,'123456','保安部')
count(*)

create trigger inse03
on yuangong for insert
as
begin
     if (select count(*) from inserted  where 部门='' )>0
     begin
          rollback
          print  '不能插入新记录'
     end
end
drop trigger inse03
insert into yuangong values  ('0001','于洋','男',20,'2007-12-26','河南',3000,2000,500,1,'123456','保安部')

删除触发器:
 create trigger 名称
 on 表名 for delete
 as
 begin
   代码
  end
用到一个临时表: deleted 存放的是准备删除的记录
禁止删除技术部的员工
  alter trigger del01
  on  yuangong for delete
  as
  begin
     if exists(select * from deleted  where 部门='人事部')
     begin
         rollback
         print  '不能删除人事部员工'
     end
  end
select * from yuangong
delete from yuangong where 编号='0006'

更新触发器:
用到临时表: 两个: 
inserted
deleted
禁止用户更新:
create  trigger upd01
on yuangong for update
as
begin
    if exists(select  * from inserted)
    begin
        rollback
        print  '不允许更改数据!'
    end
end
禁止更新基本工资和奖金
create  trigger upd01
on yuangong for update
as
begin
    if update(基本工资) or update(奖金)
    begin
        rollback
        print  '不允许更改数据!'
    end
end
 
select  * from yuangong
update yuangong set 年龄=30  where 姓名='于洋'
Create unique ix_name   on hr (姓,名)
create [unique][clustered][nonstered] index on 数据表名称(列名称)
只允许更改姓名,性别,年龄
create trigger upda02
on yuangong for update
as
begin
   if update(姓名) or update(性别)  or update (年龄)
    begin
        commit
     end
    else
    begin
      rollback
      print  '不能修改姓名,性别,年龄之外的数据'
     end
end

测试:
select * from yuangong
update yuangong set  姓名='于小洋',性别 ='女',年龄=30   where 姓名='于洋'
update yuangong set 编号='0008' where 姓名='于小洋'

create  table 学生表
(
姓名 nvarchar(8) not null primary key,
性别 nvarchar(2) not null ,
年龄 tinyint
)
create table 人数表
(
性别 nvarchar(2),
人数 int
)
insert 人数表 values ('女',0)
insert 人数表 values ('男',0)
drop TABLE 学生表

select  * from 学生表
select  * from 人数表
create trigger test2
on 学生表 for insert
as
begin
   if exists (select * from inserted where 性别='男')
   begin
     update 人数表 set 人数=(select count(*) from 学生表 group by 性别 having 性别='男')
     where 性别='男'
   end
   else
   begin
     if exists (select * from inserted where 性别='女')
      begin
         update 人数表 set 人数=(select count(*) from 学生表 group by 性别 having 性别='女')
          where 性别='女'
       end
   end
end

select  * from 学生表
select  * from 人数表
insert into 学生表 values ('小王','男',20)
insert into 学生表 values ('小胡','男',19)
alter trigger upd001
on 学生表  for  insert
as
begin
  
 update 人数表  set  人数=人数+1  where 性别 in (select 性别 from inserted )
end
drop trigger test2

select  * from 学生表
select  * from 人数表
insert into 学生表 values ('小孙','女',20)
insert into 学生表 values ('小纪','女',19)
delete from  学生表  where 性别='女'
实现删除学生记录
create trigger dele01
on 学生表 for delete
as
if exists(select  * from deleted)
 begin
    update 人数表 set 人数=(select count(*) from 学生表 where 性别='男')  where 性别='男'
        update 人数表 set 人数=(select count(*) from 学生表 where 性别='女')  where 性别='女' 
 end
测试:  分开删除






 本文转自 dufei 51CTO博客,原文链接:http://blog.51cto.com/dufei/80768,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
13天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
96 0
|
23天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
81 6
|
1天前
|
SQL 关系型数据库 MySQL
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
6 0
|
6天前
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
9天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
19 0
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
17天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
21 1