Announcement

Collapse
No announcement yet.

Trigger - Ergebnisse speichern

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

  • Trigger - Ergebnisse speichern

    Ich habe folgenden Trigger

    Code:
    CREATE TRIGGER dbo.trgStatJahr ON dbo.tblTraining
    AFTER INSERT, UPDATE
    AS
    
    SELECT YEAR(trDatum) AS Jahr, CAST(SUM(trKm) AS DECIMAL(8,2)) as sumKmJahre
    FROM tblTraining
    GROUP BY YEAR(trDatum)
    GO
    Ich möchte den Trigger erweitern, das die Ergebnisse gleich in eine Tabelle geschrieben werden.
    Kann mir jemand helfen?
    Danke

  • #2
    Wenn Du einen insert machen möchtest, dann schreib ihn doch einfach rein:
    Code:
    insert into deinetabelle (spalte1,spalte2)
      SELECT YEAR(trDatum) AS Jahr, CAST(SUM(trKm) AS DECIMAL(8,2)) as sumKmJahre
    FROM tblTraining
    GROUP BY YEAR(trDatum)
    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Danke für die Schnelle Antwort.

      Code:
      insert into deinetabelle (spalte1,spalte2) Value (Jahr, sumKmJahr)
        SELECT YEAR(trDatum) AS Jahr, CAST(SUM(trKm) AS DECIMAL(8,2)) as sumKmJahre
      FROM tblTraining
      GROUP BY YEAR(trDatum)
      So etwa?

      Danke

      Comment


      • #4
        Hast Du's denn ausprobiert?
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          Funktionieren kann's so auf jeden Fall mal nicht. Entweder er hat es nicht probiert oder er will uns die Fehlermeldungen nicht mitteilen

          Man macht entweder ein
          insert into tabelle (spalte1,spalte2) Value (Jahr, sumKmJahr) ...
          ODER ein
          insert into tabelle (spalte1,spalte2) SELECT YEAR(trDatum), CAST(SUM(trKm) from ...
          wobei ich da zum select selber nichts weiter sage ...

          bye,
          Helmut

          Comment


          • #6
            Habe es getestet

            Wollte mich melden aber war geschäftlich Unterwegs.
            Habe es mit:
            Code:
            ALTER TRIGGER [dbo].[trgStatJahr] ON [dbo].[tblTraining]
            WITH EXECUTE AS CALLER
            FOR INSERT, UPDATE
            AS
            insert into tblStatistik (statJahr,statSum) Value (Jahr, sumKmJahr) 
            SELECT YEAR(trDatum) AS Jahr, CAST(SUM(trKm) AS DECIMAL(8,2)) as sumKmJahre
            FROM tblTraining
            GROUP BY YEAR(trDatum)
            GO
            Bekomme Error: Falsche Syntax in der Nähe von 'Value'

            Danke

            Comment


            • #7
              Ja weil das Value da nicht hingehört. Das benutzt man nur, wenn es sich um feste Werte handelt aber nicht wenn man ein Subselect benutzt.

              Dim
              Zitat Tom Kyte:
              I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

              Comment


              • #8
                es Funktioniert jetzt. Habe es ohne Value umgesetzt.
                Gibt es jetzt eine Möglichkeit das die Werte nicht doppelt eingetragen werden?
                Danke

                Comment


                • #9
                  Handlet es sich hier um eine Multiuseranwendung in der mehrere User gleichzeitig arbeiten?

                  Dim
                  Zitat Tom Kyte:
                  I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                  Comment


                  • #10
                    Nein, ist nur für einen User.
                    Ich möchte meine Trainingsdaten speichern. Es gibt drei Sportarten und die sollen per Trigger in einer extra Tabelle gespeichert werden.

                    INSERT INTO tblStatistik (Sportart, Jahr, sumKmJahr)
                    SELECT sportID as Sportart, YEAR(trDatum) AS Jahr, CAST(SUM(trKm) AS DECIMAL(8,2)) as sumKmJahre
                    FROM tblTraining
                    GROUP BY YEAR(trDatum), sportID

                    Danke für die Schnelle Antwort

                    Comment


                    • #11
                      Oh dann kannst einfach deinen SELECT noch um ein NOT EXISTS erweitern:
                      Code:
                      INSERT INTO tblStatistik (Sportart, Jahr, sumKmJahr)
                      SELECT  sportID as Sportart, YEAR(trDatum) AS Jahr, CAST(SUM(trKm) AS DECIMAL(8,2)) as sumKmJahre
                      FROM tblTraining src
                      WHERE NOT EXISTS(select 1 from tblStatistik dest where src.DEINE_ID_SPALE=dest.DEINE_ID_SPALE)
                      GROUP BY YEAR(trDatum),  sportID
                      Ich zweifle jedoch ein wenig, ob der Weg den Du verwendest der optimale ist.

                      Dim
                      Zitat Tom Kyte:
                      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                      Comment


                      • #12
                        Warum ist das nicht optimal?

                        Comment


                        • #13
                          Bei jedem Insert/Update werden alle Datensätze der Tabelle verarbeitet und kopiert. Nachdem keine doppelten Sätze erlaubt sind, wird eine Änderung natürlich nicht mehr durchschlagen.

                          Des weiteren stellt sich natürlich auch die Frage, warum Du überhaupt einen Trigger verwendest. Es ist im allgemeinen schlechter Stil Programmlogik in einem Trigger zu verstecken. Fachliche Aktionen sollten über Deine Anwendung durchgeführt werden und nicht wundersam im Hintergrund passieren. Schreib eine Stored Prozedure, die von deiner AW einfach bei Bedarf aufgerufen wird.

                          Dim
                          Zitat Tom Kyte:
                          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                          Comment

                          Working...
                          X