Announcement

Collapse
No announcement yet.

Fehler in Trigger beim Update

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

  • Fehler in Trigger beim Update

    Hallo,

    ich habe da ein Problem mit einem Trigger in meiner SQL-Server 2012 Datenbank. Tabelle und Trigger sind nicht von mir.
    Ich habe der Tabelle eine neue Spalte hinzufügen müssen und muss nun ein Update auf diese Spalte ausführen, das alle NULL Werte durch den String "1" ersetzt.
    [highlight=sql]
    UPDATE TM_Teamgruppen set Mandant = '1' WHERE Mandant is NULL
    [/highlight]
    Beim Ausführen dieses Updates bekomm ich folgende Fehlermeldung:
    Meldung 512, Ebene 16, Status 1, Prozedur TM_Teamgruppen_Neu, Zeile 10Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.
    Die Anweisung wurde beendet.
    Der Inhalt dieser Fehlermeldung ist mir klar, aber ich verstehe nicht, wieso er im Trigger auftritt und wie ich ihn beheben kann.

    Dies ist der Trigger (die Stelle wo der Fehler auftritt, habe ich markiert):
    [highlight=sql]
    CREATE TRIGGER [dbo].[TM_Teamgruppen_Neu] ON [dbo].[TM_Teamgruppen]
    FOR INSERT, UPDATE, DELETE
    AS


    declare @offset int
    declare @aw int
    declare @ID int


    set @ID = (select GruppeID from inserted) <-- hier passiert der Fehler
    if (NOT @ID > 0)
    begin
    EXECUTE tdv_DBOffset @offset OUTPUT
    set @aw = (select autowert from inserted)


    update TM_Teamgruppen
    set GruppeID = @aw * 100 + @offset
    where GruppeID < 1
    end
    [/highlight]

    Hat jemand eine Ahnung oder Idee was ich da mache kann?

    Danke schon mal
    Andi

  • #2
    Dein Update versucht mehr als ein Zeile zu ändern. Alle zu ändernden Zeilen stehen in der inserted Table. Und die Zeile die bei dir scheitert erwartet das genau eine Zeile in inserted steht.
    Dein so geschriebener Trigger kann prinzipiell nicht mit Massenupdates umgehen. Wenn sich das nicht sauber in einen Update mit Subselect übersetzen läßt (z.B. wegen der tdv_DBOffset Procedure) braucht du eine Schleife über die inserted Tabelle. Oder du schaltest für den Zeitraum deines Updates mal den Trigger aus wenn das ansonsten ok ist das Massenänderungen nicht möglich sind.

    Edit: Du kannst die Spalte selbst auch als not nullable anlegen und dabei den Defaultwert auf 1 setzen. Alle Zeilen bekommen dann den Wert. Ich glaube der Trigger zieht dann nicht.
    Zuletzt editiert von Ralf Jansen; 30.10.2014, 15:29.

    Comment


    • #3
      Das mit dem Defaultwert hatte ich probiert, es stand dann aber trotzdem NULL auf dem Wert.
      Wird der Defaultwert nicht eingetragen, wenn die Spalte NULL-Werte zulässt?

      Comment


      • #4
        Der Default wird beim Alter Table nur an bereits vorhanden Daten nachgetragen wenn die Spalte not null ist.

        Comment


        • #5
          Ok, danke.
          Ich hab die Spalte jetzt als Not Null neu definiert.
          Jetzt geht es.
          Noch mal Danke

          Comment

          Working...
          X