title: SQL Server trigger conflict with reference table after delete
body: <p>I created a trigger which creates a new row with a new <code>ID</code> after a change. When I use the trigger with one table it works but when I use it on a table which has reference to another table, I am getting an error: </p>
  
  <blockquote>
    <p>DELETE statement conflicted with the REFERENCE constraint.</p>
  </blockquote>
  
  <p>The tables look like this:</p>
  
  <p><strong>Table1</strong>:</p>
  
  <pre><code>ID       BEZEICHNUNG        MENGENEINHEIT        PREIS  .....
  1        Harry Potter       Book                 20
  2        iPod               Music                150
  </code></pre>
  
  <p><strong>Table2</strong>:</p>
  
  <pre><code>DIENSTLEISTUNG_ID      RAUM_ID 
  1                      2
  2                      1  
  </code></pre>
  
  <p><strong>Table 3</strong>:</p>
  
  <pre><code>ID      Raumname ....
  1       Elbe
  2       Main
  </code></pre>
  
  <p>My trigger looks like this:</p>
  
  <pre><code>SET ANSI_NULLS ON
  GO
  SET QUOTED_IDENTIFIER ON
  GO
  
  ALTER TRIGGER [dbo].[DIENSTLEISTUNG_Update]
     ON [dbo].[DIENSTLEISTUNG]
     AFTER  UPDATE
  AS
  BEGIN
   SET  NOCOUNT ON;
  
      DECLARE @MAX_ID INT;
      SELECT @MAX_ID=MAX(ID) FROM [DIENSTLEISTUNG];
  
      declare @tmp Table(ID  numeric, BEZEICHNUNG nvarchar(64), MENGENEINHEIT nvarchar(64), 
      PREIS numeric(19,5), BESCHREIBUNG nvarchar(64), VORLAUFZEIT numeric(10),
      AZ_MO nvarchar(22), AZ_DI nvarchar(22),AZ_MI nvarchar(22),AZ_DO nvarchar(22),AZ_FR nvarchar(22),
      AZ_SA nvarchar(22),AZ_SO nvarchar(22),DIENSTLEISTUNGSART_ID numeric(38),
      UPDATE_USER numeric(38), UPDATE_DATE datetime, RUESTZEIT numeric(38),
      PERMISSIONS numeric (38), KONTRAKTPOSITION numeric(38),ARTIKELNUMMER nvarchar(64),
      ANZAHL numeric(10), BUCHUNGSHINWEIS nvarchar(255), SONDERWUNSCH char(1),
      FLAG bit)
  
      insert into @tmp
      select
      ID, BEZEICHNUNG, MENGENEINHEIT, 
      PREIS, BESCHREIBUNG, VORLAUFZEIT,
      AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
      AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
      UPDATE_USER, UPDATE_DATE, RUESTZEIT,
      PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
      ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH,
      1 [flag] from deleted;
  
  
      delete T from DIENSTLEISTUNG T JOIN @tmp I
      ON T.ID=I.ID
  
  SET IDENTITY_INSERT   [DIENSTLEISTUNG] ON
  INSERT INTO [DIENSTLEISTUNG] (ID, BEZEICHNUNG, MENGENEINHEIT, 
      PREIS, BESCHREIBUNG, VORLAUFZEIT,
      AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
      AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
      UPDATE_USER, UPDATE_DATE, RUESTZEIT,
      PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
      ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH,
      FLAG)
  SELECT @MAX_ID+ROW_NUMBER() OVER(ORDER BY ID) [ID],BEZEICHNUNG, MENGENEINHEIT, 
      PREIS, BESCHREIBUNG, VORLAUFZEIT,
      AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
      AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
      UPDATE_USER,GETDATE(),RUESTZEIT,
      PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
      ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH,
      0 
  FROM INSERTED
  union all
  select * from @tmp
  
   SET IDENTITY_INSERT dbo.DIENSTLEISTUNG OFF
   SET  NOCOUNT OFF;
  END;
  </code></pre>