您的位置:首页 > 数据库

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

2015-12-18 17:26 447 查看
在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
可参考帖子/article/6164253.html

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: