请教:使用触发器检查新insert插入数据
现在有一张表,结构如下:
CREATE TABLE [dbo].[tab](
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](50) NULL,
[name] [nvarchar](20) NULL,
[time] [datetime] NULL
) ON [PRIMARY]
往这个表里插入数据的程序分散在很多地方。
为了阻止重复的数据插入,准备写一个触发器。
期望是,在插入数据时,检查最新的100条数据里、有多少条重复记录(按title,name两个字段检查重复);如果重复记录超过3条,就不再插入数据。
请问这个触发器怎么写?
谢谢! 触发器
[解决办法]
1、为了阻止重复的数据插入————建议设计表的时候建立主键或唯一索引
2、if exists(select 1 from inserted group by title,[name] having count(title)>3)
......
[解决办法]
CREATE TABLE [dbo].[tab](
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](50) NULL,
[name] [nvarchar](20) NULL,
[time] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TRIGGER tr_instead ON dbo.tab
INSTEAD OF INSERT
as
begin
--在插入数据时,检查最新的100条数据里、有多少条重复记录(按title,name两个字段检查重复);如果重复记录超过3条,就不再插入数据。
SELECT * FROM INSERTED
INSERT INTO tab(title, name, [time])
SELECT I.[title],I.[name], GETDATE()
FROM INSERTED I
left JOIN
(
SELECT TOP(100) title, name FROM tab WITH(NOLOCK) ORDER BY [time] DESC
) T
ON i.title = i.title
AND I.NAME = T.NAME
GROUP BY i.title, i.name
HAVING COUNT(t.title) < 3
END
GO
INSERT INTO [tab](TITLE,NAME, TIME)
SELECT '1', '1', GETDATE()--插入3次后,将插入不进去
/*
idtitlenametime
1112013-08-20 16:51:20.387
2112013-08-20 16:51:25.150
3112013-08-20 16:51:34.037
*/