SQL触发器编程(insert/update/delete)

在Microsoft SQL Server Management Studio中编写各种触发器程序。

首先在相应的表下新建触发器,触发器的大体结构如下:(其余的都可以删掉了)

CREATE TRIGGER [dbo].[SiteNodeDeleteTrigger]   //ASiteNodeDeleteTrigger]是触发器名称
   ON  [dbo].[SiteNode]   //SiteNode是触发器所在的数据表
   AFTER DELETE   //增删相应的触发器条件,如果全要则是AFTER DELETE,INSERT,UPDATE  
AS

...    //添加自己的代码
BEGIN
 ...   //添加自己的代码

END


1、在一个触发器中判断是插入,更新还是删除

 IF EXISTS( SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)    //插入

...

 IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)    //更新

...

 IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)   //删除

...

说明:只有inserted和deleted表。

插入inserted表中有数据,deleted表中无数据

更新inserted表中有数据,deleted表中有数据

删除inserted表中无数据,deleted表中有数据


2、当你的表字段允许为null时最好加上判断,否则通过触发器把取到的有null字段的数据插入到别的表会报错
IF EXISTS(select * from inserted where LotNo is null)   //字段为null,其中LotNo为可能为null的字段
...
IF EXISTS(select * from inserted where LotNo is not null)   //字段非null
...

3、在一个触发器中融合各种情况,程序如下
ALTER TRIGGER [dbo].[SiteNodeDeleteTrigger]
   ON  [dbo].[SiteNode]
   AFTER DELETE,UPDATE,INSERT

AS

DECLARE @strTableName varchar(50),
 @strKeyGroup varchar(200),
 @strOperatorType varchar(8);

 IF EXISTS( SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted) AND EXISTS(select * from inserted where LotNo is null)
 select @strTableName='SiteNode',
 @strKeyGroup=SiteCode+','+SiteGroup+','+cast(IsLeaf as varchar(10))+', ',
 @strOperatorType='insert' from inserted;

 IF EXISTS( SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted) AND EXISTS(select * from inserted where LotNo is not null)
 select @strTableName='SiteNode',
 @strKeyGroup=SiteCode+','+SiteGroup+','+cast(IsLeaf as varchar(10))+LotNo,
 @strOperatorType='insert' from inserted;

 IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted) AND EXISTS(select * from inserted where LotNo is null)
... 

IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted) AND EXISTS(select * from inserted where LotNo is not null)
... 

IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
... 

BEGIN
 INSERT INTO DeleteTables (TableName,TableKeyGroup,OperatorType) VALUES @strTableName,@strKeyGroup,@strOperatorType)

...

  END

4、格式转换
(1)在SQL中把日期格式time/date/datetime转换成字符串,用以下方式:
CONVERT(varchar(23), Date, 111)  //其中23是字符的长度,Date是要转换的字段名,111是转换成字符串后的格式。
具体对应如下
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM 
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06 
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06 
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06 
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06 
Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06 
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46 
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM 
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06 
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16 
Select CONVERT(varchar(100), GETDATE(), 12): 060516 
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937 
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967 
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47 
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157 
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM 
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16 
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47 
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250 
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM 
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006 
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16 
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006 
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006 
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006 
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006 
Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006 
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49 
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM 
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006 
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16 
Select CONVERT(varchar(100), GETDATE(), 112): 20060516 
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513 
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547 
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49 
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700 
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827 
Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM

(2)其余类型转换成字符串
cast(IsLeaf as varchar(10))   //其中IsLeaf是要转换的字段名,10是字符长度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值