时间:2021-07-01 10:21:17 帮助过:32人阅读
前段时间需要用触发器做个实现数据插入表时自动编号的功能,于是再学习下触发器,硬件备份共享于此,以供讨论,以免遗忘
总结常用基本点如下:
CREATE TRIGGER
ON
{{{FOR|AFTER} <[INSERT] [,] [UPDATE],[DELETE]>}|INSTEAN OF}
AS
4、触发器必须附加到表或视图上,触发器不能单独存在。AFTER或FOR触发器不支持视图,INSTEAD OF支持表或视图。
5、INSERT触发器中,SQL Server 会创建一个插入行的副本,并把该副本插入到一个特殊表Insert表中,该表只在触发器作用域内存在。
6、DELETE触发器中,SQL Server 会创建一个删除行的副本,并把该副本插入到一个特殊表Delete表中,该表只在触发器作用域内存在。
7、UPDATE触发器中,SQL Server认为更新的记录是删除了现有的记录,插入更新后的新纪录,所以UPDATE触发器中包含Insert和Delete两个特殊表,也是只存在触发器作用域内,这两个表的行数完全一样。
8、触发器尽可能简短,因为触发器和触发器内的语句被一同处理,即直到语句执行完成才算是触发器完成。如果代码很长那触发器运行时间就会很长。
下面是个实现自动编号功能的例子:
代码如下:
--有两张表,客户表和项目表,要求:新建项目时自动生成项目编号,每个不同的客户的项目的编号从1开始
--项目编号格式为PJ+"-"+"客户编号"+"-"+"日期"+"-"+"流水号"
--如项目编号:PJ-ABCD-120805-0001
create table testAccount --创建测试客户表
(
tAccName nvarchar(100), --客户姓名
tAccId nvarchar(32) --客户编号
)
create table testProject --创建测试项目表
(
tProName nvarchar(100), --项目名称
tProId nvarchar(32), --项目编号
tIdAcc nvarchar(100), --客户编号
tProGuid nvarchar(64) --guid
)
go
create trigger T_AutoNumber
on testProject
after insert
as
begin
declare @one nvarchar(8), --编号第一部分,PJ
@two nvarchar(32), --编号第二部分,客户编号
@three nvarchar(8), --编号第三部分,日期
@four int, --编号第四部分,流水号
@guid nvarchar(64) --guid
set @one='PJ'
set @three= convert( varchar(8),GETDATE(),112)
--从Inserted副本表里获取当前插入数据的客户编码和guid
select @two=tIdAcc,@guid=tProGuid from Inserted
--获取编号最后四位
select @four=max(cast(right(tProId,4)as int))
from testProject
where tIdAcc=@two
--对每一个新客户的流水号都是从1开始,已存在客户为最大流水号加1
if @four is null
set @four=0
else
set @four=cast(@four as int)
set @four=@four+1
update testProject set tProId=@one+'-'+@two+'-'+@three+'-'+right('0000'+cast(@four as varchar),4) where tProGuid=@guid
end
go
--生成测试表数据
insert into testAccount values ('小小鸭有限公司','XXYGS')
insert into testAccount values ('丑小鸭有限公司','CXY')
insert into testProject (tProName,tIdAcc,tProGuid)values ('小鸭成长项目','XXYGS',newid())
insert into testProject (tProName,tIdAcc,tProGuid)values ('小鸭学游泳项目','XXYGS',newid())
insert into testProject (tProName,tIdAcc,tProGuid)values ('丑小鸭成长项目','CXY',newid())
select * from testProject
drop table testAccount
drop table testProject
9.调试触发器:新建查询窗口,输入下来代码,按下F11即可逐语句运行下列脚本,进入到触发器中。也可在触发器里设置断点,然后按F11逐语句执行。
代码如下:
begin tran
insert into testProject (tProName,tIdAcc,tProGuid)values ('小鸭成长项目','XXYGS',newid())
insert into testProject (tProName,tIdAcc,tProGuid)values ('小鸭学游泳项目','XXYGS',newid())
insert into testProject (tProName,tIdAcc,tProGuid)values ('丑小鸭成长项目','CXY',newid())
if @@TRANCOUNT>0
rollback tran人气教程排行
- 355次 1 对数据库模式进行规范化处理,是在数据库设计的什么阶段?
- 355次 2 mysql如何删除多个表格数据库数据
- 355次 3 Oracle购买价格和服务费计算方式
- 355次 4 MYSQL查看和新增表分区
- 354次 5 TRACE32调试技巧
- 353次 6 Oracle数据库教程:ORA-01031:权限不足
- 353次 7 Oracle物化视图失效的几种情况及测试
- 352次 8 mysql-sql语句查询多个字段不等于零怎么写?
- 351次 9 如何提高mysql大批量数据更新(update)的效率?
- 350次 10 mysql如何从ibd文件恢复数据
- 350次 11 ORACLEROLLUP和CUBE函数
- 350次 12 IBMDB2赋权[SQL0551N]
- 350次 13 mysql不等于符号写法
- 349次 14 redhat8mysql安装具体过程_MySQL
- 349次 15 SQLServer出现Error:1326错误(管理器无法连接远程数据库)问题解决方案
- 348次 16 centos下配置mysql数据库自动备份
- 348次 17 MySQL中使用SQL语句对字段进行重命名
- 347次 18 数据库中的表以行和列来组织数据,每一行称为每一列称为
- 347次 19 windowsservice-mysql安装出错,远程调用失败
- 346次 20 SQL连接查询语法及使用