Tsql 触发不拯救历史

Tsql 触发不拯救历史,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,版本:SQL Server 2008 R2 此触发器检查主键冲突(如果有),将行移动到历史记录表;然后删除该行;然后插入导致冲突的行 但它没有做好自己的工作 CREATE TRIGGER [dbo].[ONINSERT] ON [dbo].[TICKETS] Instead of INSERT AS BEGIN DECLARE @ID VARCHAR(200) SET NOCOUNT ON; SET @ID = (SELECT TICKET_ID FROM ins

版本:SQL Server 2008 R2

此触发器检查主键冲突(如果有),将行移动到历史记录表;然后删除该行;然后插入导致冲突的行

但它没有做好自己的工作

CREATE TRIGGER [dbo].[ONINSERT]
   ON  [dbo].[TICKETS]
   Instead of INSERT
AS 
BEGIN
DECLARE @ID VARCHAR(200)
    SET NOCOUNT ON;
    SET @ID = (SELECT TICKET_ID FROM inserted)

    INSERT TICKET_HISTORY
    SELECT * FROM TICKETS  
    WHERE 
    TICKET_ID = @ID ;
    print 'Inserting ' + @id

    DELETE FROM TICKETS
    WHERE TICKET_ID = @ID; 
    print 'Deleting' + @id

    INSERT TICKETS
    SELECT * FROM inserted; 
    print 'Inserting back' + @id 

即使有多个插入,触发器也只会触发一次,因此在您的情况下,我看不到会发生这种情况……您不需要再次删除该行,因为instead of insert通常意味着instead of insert执行一些自定义操作

  if exists
    (
    select 1 from inserted i
    join
    mytable t
    on t.id=i.id
    )
    begin
    --insert into tickets history
    insert into ticketshistory
    select i.* from inserted i
    join
    mytable t where t.id=i.id
---you can add custom logic to alert or simply ignore
    return

    end
    --this is needed since if there is no violation you have to insert rows
    insert into tickets
    select * from inserted
“插入”和“删除”是表,因此它们可以表示集合操作的结果。在假设触发器总是只处理一行的情况下设计触发器通常是一个糟糕的计划。如果您绝对确定不会有超过一行,那么请添加对行数的检查,并使用RaIsError或Throw显式通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1,则会出现错误“FooTable_Insert:最多只能处理一行”。、25、42以及日志