如何写一个触发器在
在表中的记录变更时作删除重复记录操作如表A 现有的记录
fileid name
001 aa
002 bb
003 cc当表A中记录更新(即有多条新的记录插入时)
如插入
001 aa
004 dd
时,则触发一个触发器即重写A表将A表变成fileid name
001 aa
002 bb
003 cc
004 dd
请问触发器如何写
在表中的记录变更时作删除重复记录操作如表A 现有的记录
fileid name
001 aa
002 bb
003 cc当表A中记录更新(即有多条新的记录插入时)
如插入
001 aa
004 dd
时,则触发一个触发器即重写A表将A表变成fileid name
001 aa
002 bb
003 cc
004 dd
请问触发器如何写
Create table a([fileid] char(3), [name] varchar(20))
insert into a
select '001', 'aa' union all
select '002', 'bb' union all
select '003', 'cc'insert into a ([fileid] , [name])
select * from (select '001' f1 ,'aa' f2 union all select '004' ,'dd') as tmp
where not exists(select 1 from a where f1=[fileid] and f2=[name])select * from adrop table a
(所影响的行数为 3 行)
(所影响的行数为 1 行)fileid name
------ --------------------
001 aa
002 bb
003 cc
004 dd(所影响的行数为 4 行)
INSERT a SELECT '001','aa'
union all select '002','bb'
union all select '003','cc'
go
CREATE TRIGGER att
ON a
instead OF INSERT,UPDATE
AS
INSERT a SELECT * FROM inserted WHERE fileid NOT IN(SELECT fileid FROM a)
--创建test表
create table test
(
field varchar(100),
name varchar(100)
)
--插入初始数据
insert into test(field,name) select '001','aa'
union all select '002','bb'
union all select '003','cc'
--显示初始数据
select '显示初始数据'
select * from test
go
--创建触发器
select '创建触发器'
go
create trigger trg_test on test
instead of insert
as
begin
insert into test (field,name) select field,name from inserted where not exists(select * from test where test.field=inserted.field)
end
go
--插入测试数据
select '插入测试数据'
insert into test(field,name) select '001','aa'
union all select '002','bb'
union all select '003','cc'
union all select '004','dd'
go
insert into test(field,name) select '001','aa'
union all select '002','bb'
union all select '003','cc'
union all select '005','ee'
go
--检验测试结果
select '检验测试结果'
select * from test
go
--删除test表
drop table test
go
ON tablea
instead OF INSERT,UPDATE
AS
begin
INSERT tablea
SELECT *
FROM inserted i
WHERE not exists(SELECT 1 FROM tablea where fileid = i.fileid )
end
go
谢谢大家的帮助
SELECT *
FROM deleted
指定 DML 触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被激发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。如果仅指定 FOR 关键字,则 AFTER 为默认值。 不能对视图定义 AFTER 触发器。
----------------------------------------------------------------------
INSTEAD OF
指定 DML 触发器是“代替”SQL 语句执行的,因此其优先级高于触发语句的操作。不能为 DDL 触发器指定 INSTEAD OF。对于表或视图,每个 INSERT、UPDATE 或 DELETE 语句最多可定义一个 INSTEAD OF 触发器。但是,可以为具有自己的 INSTEAD OF 触发器的多个视图定义视图。 INSTEAD OF 触发器不可以用于使用 WITH CHECK OPTION 的可更新视图。如果将 INSTEAD OF 触发器添加到指定了 WITH CHECK OPTION 的可更新视图中,则 SQL Server 将引发错误。用户须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。 看帮助吧,讲的详细