Announcement

Collapse
No announcement yet.

Update Trigger auf ein einzelnes Feld

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

  • Update Trigger auf ein einzelnes Feld

    Hallo Zusammen,
    ich versuche gerade einen Trigger zu realisieren der einzelne Felder updaten kann. Leider bekomme ich es nicht alleine hin. Vieleicht kann mir jemand hierzu ein paar Tipps geben.
    Hier die Ausgangssituation:
    Ich habe eine Tabelle mit 50 Spalten und 1000 Reihen.
    Jede Spalte steht für einen Messparameter. In den 1000 Feldern jeder Spalte stehen Integer Zahlen drin die eine Gausskurve wiederspiegeln.
    Bedeutet also die Tabelle enthält 50 Gausskurven mit je 1000 Feldern.

    Wenn nun ein neuer Messwert in diese Tabelle eingetragen wird, zähle ich ein entsprechendes Feld um 1 hoch. Diese Tabelle bezieht sich auf einen kompletten Produktonsauftag der über mehrere Tage geht.

    Nun habe ich als Anforderung das eine zweite Tabelle entstehen soll, die nur den Zeitraum einer Schicht (8h) wiederspiegeln soll.

    Meine Idee war hierzu, das ich einen "after Update" Trigger der Haupt-Gaus Tabelle nehmen könnte, um in der Schicht-Gausstabelle das selbe Feld zu inkrementieren.

    Leider habe ich keinen fernünftigen Ansatz hierzu. Ich möchte ja nicht den Wert der Haupttabelle in die Schichttabelle übernehmen, sondern nur beim inkrementieren der Haupttabelle gleichzeitig die Schichttabelle inkrementieren.

    Könnte mir jemand hierbei auf die Sprünge helfen?

    MfG
    Clyde

  • #2
    Ich habe eine Tabelle mit 50 Spalten und 1000 Reihen.
    Jede Spalte steht für einen Messparameter. In den 1000 Feldern jeder Spalte stehen Integer Zahlen drin die eine Gausskurve wiederspiegeln.
    Bedeutet also die Tabelle enthält 50 Gausskurven mit je 1000 Feldern.
    Kannst du mir das mal ausdeutschen? Eine Spalte hat einen Datentyp wie Integer oder varchar oder datetime .... was sind dann 1000 Felder je Spalte?
    Oder beinhaltet die Tabelle fix 50 Records mit je 1000 Spalten oder meinst du ganz was anderes ...

    bye,
    Helmut

    Comment


    • #3
      Hallo Helmut,
      entschuldigung wenn ich mich nicht richtig ausgedrückt habe.

      Die 50 Spalten (hier ParamX) sind Integers.
      Die 1000 sind dann die Datensätze.

      Ich probiers mal grafisch. Exemplarisch fülle ich mal nur die Spalte Param5

      Haupttabelle:
      --------------------------------------------------------------------------------------
      ---- Param1 Param2 Param3 Param4 Param5 ... Param50
      1________________________________ 0
      2________________________________1
      3________________________________4
      4________________________________5
      5________________________________4
      6________________________________1
      7________________________________0
      .
      .
      .
      1000




      Schichttabelle:
      --------------------------------------------------------------------------------------
      ---- Param1 Param2 Param3 Param4 Param5 ... Param50
      1________________________________0
      2________________________________0
      3________________________________0
      4________________________________0
      5________________________________0
      6________________________________0
      7________________________________0
      .
      .
      .
      1000

      Wenn jetzt der 4. Datensatz von Param5 der Haupttabelle inkrentiert wird , möchte ich mit einem Trigger erreichen das auch das selbe Feld der Schichttabelle inkrementiert wird. In diesem Fall also von 0 auf 1.


      Ich hoffe ihr wisst jetzt was ich meine

      MfG
      Clyde
      Zuletzt editiert von Clyde; 01.09.2010, 18:21.

      Comment


      • #4
        In diesem Fall musst du entweder die Aktion (Insert/Update/Delete) entweder darauf beschränken, dass immer nur 1 Record angesprochen wird (würde das auch im Trigger kontrollieren: if @@rowcount <> 1 raiserror('zu viele Records', 16, 1) ) oder du gehst mit einem Cursor durch Inserted.
        Weiters musst du dann jedes Feld einzeln checken:
        if (select param1 from inserted) <> (select Param1 from deleted) update Schichttabelle ...
        if (select param2 from inserted) <> (select Param2 from deleted) update Schichttabelle ...
        if (select param3 from inserted) <> (select Param3 from deleted) update Schichttabelle ...
        ...
        Mit UPDATE(column) alleine geht es wahrscheinlich nicht, außer es stehen nur die Spalten im Update-Befehl, die wirklich geändert werden und der Wert ändert sich tatsächlich, denn das UPDATE(column) liefert auch TRUE, wenn die Spalte nur im Update-Kommando vorkommt und sich der Wert eigentlich nicht ändert.
        Ach ja, du solltest dir dann auchnoch etwas wegen der NULL-Behandlung überlegen, denn ein Vergleich eines NULL-Wertes mit einem realen Wert ergibt gar nichts, da würde also nichts passieren!

        bye,
        Helmut

        Comment


        • #5
          Hallo Helmut,
          danke für die Antwort. Werde es so mal probieren.

          Gibt es die Möglichkeit mit Schleifen in Triggern zu arbeiten?
          Da ich ja Param1 bis 50 habe würde sich das anbieten.

          mfg
          Clyde

          Comment


          • #6
            Geht prinzipiell schon, aber nur mit größerem Aufwand:
            Code:
            ...
            -- da man dynamisches SQl braucht und dieses dann aber die Tabellen
            -- inserted und deleted nicht mehr kennt, muss man diese umkopieren:
            select * into #ins from inserted
            select * into #del from deleted
            ...
            -- ich gehe jetzt mal davon aus, wir haben nur einen einzigen Record
            -- geändert und lasse daher den cursor-Teil weg...
            
            declare @x int, @cmd varchar(500)
            -- jetzt die Schleife:
            set @x = 1
            while @x <= 50 begin
              set @cmd = 'if (select Param' + cast(@x as varchar) + ' from #ins) <>
             (select Param' + cast(@x as varchar) + ' from #del) update Schichttabelle ...'
              exec (@cmd)
              set @x = @x + 1
            end
            ...
            Ist sicher nicht ganz vollständig und fehlerfrei, aber sollte mal den ungefähren Weg zeigen. Ich befürchte nur, dass Ganze könnte Performanceprobleme machen, also gut durchtesten!

            bye,
            Helmut

            Comment

            Working...
            X