Announcement

Collapse
No announcement yet.

Insert/Delete/Update Trigger für mehrerere Datenbanken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Insert/Delete/Update Trigger für mehrerere Datenbanken

    Hallo,
    ich versuche verzweifelt einen Trigger zu schreiben,
    der einen Datensatz einer Tabelle über mehrere Datenbanken bearbeitet.
    Der Delete-Trigger funktioniert ohne Probleme, nur beim Insert und Update Trigger bekomme ich von unserem Programm Fehlermeldungen, dass "Inserted" ein ungültiges Objekt wäre. Beim Versuch "Inserted" in eine Variable zu speichern bekomme ich die Fehlermeldung, dass nur ein Ausdruck in die Variable gespeichert werden kann. Nun habe ich Angst, dass ich jede Spalte in einzelne Variablen speichern muss.. ( 89 Spalten )
    Vielleicht habt Ihr einen Rat für mich?

    Code:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    
    ALTER TRIGGER [INSERT] ON [dbo].[Mitarbeiter]
    WITH EXECUTE AS CALLER
    AFTER INSERT
    AS
    BEGIN
      declare @i int
      declare @y varchar(max)
      declare @SQLStr varchar(max)
      set @i = 1
    While @i < 18
     Begin
     
     set @y = @i;
     set @SQLStr = ' INSERT INTO [tbl'+@y+'].[dbo].[Mitarbeiter]  (
          [Suchbegriff],
          [Anrede],
          [Firma1],
          [Firma2],
          [Name],
          [Vorname],
          [Strasse],
          [Land],
          [Plz],
          [Ort],
          )
     SELECT
          [Suchbegriff],
          [Anrede],
          [Firma1],
          [Firma2],
          [Name],
          [Vorname],
          [Strasse],
          [Land],
          [Plz],
          [Ort],
      FROM Inserted'
    exec (@SQLStr)
    set @i = @i + 1
    END
    END

  • #2
    Hallo nino,

    hier geht es um den MS SQL 2005, stimmts?

    "inserted" ist eine virtuelle Tabelle, die ausschließlich innerhalb des Triggers zur Verfügung steht.
    Die kannst Du nicht mit EXEC über dynamischem SQL verwenden oder an eine Stored Procedure übergeben o.ä.

    Du kannst nur Dein dyn.SQL so umbauen, das Du die Werte einbaust (INSERT INTO ... VALUES(..)).
    Dabei ist aber zu beachten, das in "inserted" 0-n Datensätze stehen, also müsstest Du das mit einem Cursor abarbeiten.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Richtig, es geht um MS SQL 2005.
      Hm mit Cursor hab ich noch nicht allzu viel gemacht (nahezu nichts)
      Ich könnte aber auch jede Spalte in Variablen einlesen?
      set @inserted = (Select * From Inserted)
      als Beispiel geht ja leider nicht,

      aber
      set @inserted = (Select Suchbegriff From Inserted)

      Comment


      • #4
        set @inserted = (Select * From Inserted)
        Würde nur gehen, wenn @inserted als lokale Table-Variable definiert ist; und da sie lokal ist, hilft sie Dir auch nicht weiter.

        Ginge noch der Weg über eine Global-Temporäre Tabelle (##tabelle).

        Die Lösung mit Cursor sieht im Prinzip so aus, wobei mit der SP_EXECUTESQL die Möglichkeit besteht, Parameter zu verwenden; siehe alternatives SQL Statement:

        [highlight=SQL]-- Deklaration Variablen
        DECLARE @Feld1 VARCHAR(15)
        DECLARE @Feld2 VARCHAR(15)
        DECLARE @Feld3 VARCHAR(15)
        -- usw
        DECLARE @SQL NVARCHAR(max)

        -- Deklaration Cursor
        DECLARE cCursor CURSOR LOCAL READ_ONLY FOR
        SELECT Feld1, Feld2, Feld3
        FROM inserted

        -- Cursor öffnen und durchlaufen
        OPEN cCursor
        IF @@Cursor_Rows<>0
        BEGIN
        FETCH NEXT FROM cCursor INTO @Feld1, @Feld2, @Feld1
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
        -- Als dynamisches SQL "zusammengebastelt": Typen / Konvertierung beachten (lästig)
        SET @SQL = (SELECT 'INSERT INTO Datenbank.dbo.Tabelle ' +
        '(Feld1 , Feld2, Feld3) '+
        'VALUES (''' + @Feld1 + ''', ' +
        '''' + @Feld2 + ''', ' +
        '''' + @Feld2 + ''' )' )
        EXEC sp_executesql @SQL

        -- Alternative mit Parametern: Etwas eleganter & viel (Typ-)sicherer
        SET @SQL = (SELECT 'INSERT INTO Datenbank.dbo.Tabelle ' +
        '(Feld1 , Feld2, Feld3) '+
        'VALUES (@ParaFeld1, @ParaFeld2, @ParaFeld3)' )
        EXEC sp_executesql @SQL, N'@ParaFeld1 varchar(15), @ParaFeld2 varchar(15), @ParaFeld3 varchar(15)',
        @Feld1, @Feld2, @Feld3

        FETCH NEXT FROM cCursor INTO @Feld1, @Feld2, @Feld1
        END
        CLOSE cCursor
        END
        DEALLOCATE cCursor[/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment

        Working...
        X