如何写一个触发器在
在表中的记录变更时作删除重复记录操作如表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
请问触发器如何写

解决方案 »

  1.   

    既然fileid及name必须唯一,把它们设置成主键不就可以了.
      

  2.   

    不用写触发器在批量写数据时 如下即可
    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 行)
      

  3.   

    CREATE TABLE a(fileid VARCHAR(20),   name VARCHAR(20))
    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)
      

  4.   


    --创建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
      

  5.   

    CREATE TRIGGER tirggername
    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
      

  6.   

    SQL  高手真多呀,触发器我没常用,不明白,inserted ,updated,deleted这三个表的作用,还有就是大家上面的都用到instead of  而不是用  after  请问有什么区别,能说说吗,
    谢谢大家的帮助
      

  7.   

    deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用: 
    SELECT *
    FROM deleted
      

  8.   

    AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。不能在视图上定义 AFTER 触发器。INSTEAD OF指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。
      

  9.   

    AFTER 
    指定 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 触发器。 看帮助吧,讲的详细