Announcement

Collapse
No announcement yet.

Trigger für insert mit Prüfung auf neue Datensätze

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

  • Trigger für insert mit Prüfung auf neue Datensätze

    Hi,

    ich hab grad folgendes Problem:
    Ich habe eine Tabele die jede Viertelstunde (also um 15, 30, 45, und 00)
    mit neuen Datenversorgt wird.

    Soweit mir bekannt, wird immer die komplette Tabelle gelöscht und dann neubefüllt. Es kommen aber eigentlich nur die Datensätze der letzten Viertelstunde dazu.

    Frage ist nun also wie kann ich nur diese neuen Daten per Trigger in meine History_Tabelle kopieren?

    In der OnlineTabelle sind enthalten das Feld [Datum] und [Uhrzeit] an denen man sich festhalten könnte.

    Ich muss es hinbekommen das in der History die Daten der letzten 3 Tage verfügbar sind.

    Bitte Ideen und Codelines, ich hab grad nen völligen Hänger....

    Viele Grüße und vorab Danke!
    Ich hab keine Ahnung was ich tue aber ich will es lernen

  • #2
    Vielleicht hilft das mal als Einstieg (gilt für Version 2000 genauso):
    http://entwickler-forum.de/showthread.php?t=38529

    bye,
    helmut

    Comment


    • #3
      Hallo Helmut,

      danke für den Post,
      ich habs zwar noch nicht ganz geschnallt weil der vergleicht ja nix, bin aber am basteln. ich glaub um das mit dem Fetch rauszubekommen hätt ich def. 2 wochen gebraucht...

      hat jemand eine Idee wie ich einen vergleich mache ob
      Datum, Intervall, App in Online und Historie übereinstimmen?
      wenn ja darfs nicht nochmal rein gespielt werden und wenn es nicht übereinstimmt dann soll ein insert in Historie folgen.
      Ich hab keine Ahnung was ich tue aber ich will es lernen

      Comment


      • #4
        Angenommen die Einfügetabelle und die Historie haben den exakt gleichen Feldaufbau in Anzahl, Typ und Reihenfolge:

        insert into historientabelle select * from inserted
        where not exists (select 1 from historientabelle
        where historientabelle.primaryKey = inserted.primaryKey)


        historientabelle ersetzt du durch den Namen deiner Tabelle, 'inserted' bleibt so, denn das ist die temporäre Tabelle im Trigger mit den neu eingefügten Datensätzen und beim Vergleich musst du den primary key angeben, der könnte zB auch zusammengesetzt sein:

        ... where historientabelle.datum = inserted.datum and historientabelle.uhrzeit= inserted.uhrzeit)


        oder wie immer das dann bei dir aussieht.

        bye,
        Helmut

        Comment


        • #5
          Ok da ist er mal wieder...

          nach wochen komm ich endlich mal wieder zu diesem Projekt.

          der Trigger sieht erstmal so aus:

          Code:
          ALTER TRIGGER [dbo].[NowToHistory]
             ON  [dbo].[Now]
          FOR delete as
          BEGIN
          Insert Into Historie (
          [Datum],[Intervall],[App],[Anna],[Bele],[Bese],[Abf],[Abf5],[Anna10],[Anna20],[Über],[Ange]
          ) 
          SELECT 
          [Datum],[Intervall],[App],[Anna],[Bele],[Bese],[Abf],[Abf5],[Anna10],[Anna20],[Über],[Ange]
          FROM deleted
          where not exists (
          select 1 from OLD_Diagramme_Historie
          where OLD_Diagramme_Historie.[Datum] = deleted.[Datum] 
          and OLD_Diagramme_Historie.Intervall = deleted.Intervall
          and OLD_Diagramme_Historie.[App] = deleted.[App])
          
          END
          Problem ist das ich jetzt (grad auf den Tisch bekommen)
          nicht nur die orginal Werte archivieren soll sondern auch noch einige aus anderen tabellen und vor allem welche die erst aus den Werten berechnet werden.

          Bsp.:
          Tabelle1 = [Datum],[Intervall],[App],[Anna],[Bele],[Bese] usw.
          Tabelle2 = ],[Intervall], [Fore], [More], [Commi] (Von dieser Tabelle gibt es eine pro [APP])
          Dazu kommen folgende Werte: [SQ], [SL] (Diese werden in den Views zu der entsprechenden [APP] berechnet)

          raus kommen soll:
          eine Tabelle wie folgt:
          [Datum],[Intervall],[App],[Anna],[Bele],[Bese], [Fore], [More], [Commi], [SQ], [SL]

          also wie Join ich am besten die Werte [Fore], [More], [Commi], [SQ] & [SL] des entsprechenden Intervall und der entsprechenden Application [App] an?
          Ich hab keine Ahnung was ich tue aber ich will es lernen

          Comment


          • #6
            Ich hätte da grad mal noch ne Frage:
            kann ich auch einen Trigger auf die Systemzeit setzen?
            also wenn
            Code:
             select convert(char(10),GetDate(),8) = '00:01:00
            dann soll ein select into ausgeführt werden.
            Ich hab keine Ahnung was ich tue aber ich will es lernen

            Comment


            • #7
              Nein, das geht so nicht. Aber mit dem SQLAgent kannst du sowas umsetzen. Allerdings ist der in der Express-Edition nicht enthalten.

              bye,
              Helmut

              Comment


              • #8
                Verdammt da hat man schon die Enterprise und auch den Agent aber man darf nicht damit spielen... manchmal hasse ich meinen Job...

                Ok dann mal anders...

                Mit select .... into wird ja immer eine neue Tabelle angelegt, gibt es einen Befehl mit dem man an eine bestehende Tabelle anhängen kann?
                (achja nur der Vollständigkeit halber: ich brauch warscheinlich eine Whereklausel zum abgleich der Daten.)

                An dieser Stelle nochmal einen Herzlichen Dank an alle die mir hier so toll weiterhelfen.

                DANKE
                Ich hab keine Ahnung was ich tue aber ich will es lernen

                Comment


                • #9
                  Hallo mal wieder,

                  folgendes Problem:
                  Ich habe Werte einer View die archiviert werden sollen.
                  Der SQL-Agent steht mir aufgrund sehr strenger Berechtigungshirarchien nicht zur Verfügung, daher fällt die Option "Systemzeit" (wie oben beschrieben) aus.
                  Ich habe aber einen Wert der 00:00 Uhr jede nacht in die Datenbank importiert wird.

                  Frage:
                  kann ich irgendwie eine Anfügeabfrage auf eine festgelegte Tabelle machen?
                  und das immer wenn der Wert '23:45' in der Spalte "Intervall" auftaucht.
                  Die Values die insertet werden sollen kenne ich ja nicht weil sie sich immer ändern.
                  Ich hab keine Ahnung was ich tue aber ich will es lernen

                  Comment


                  • #10
                    Update: ich habe jetzt einen Insert, delete und einen update trigger ausprobiert um meine daten zu bekommen.

                    der delete geht bringt aber auf grund der löschung der daten keine ergebnisse
                    weil die daten in views berechnet werden die auf der geänderten tabelle beruhen.

                    der insert trigger und der update trigger bringen mir nix zurück...

                    auf nachfrage bekam ich den verdacht geäußert das die daten ja per DTS und dort warscheinlich mit BulkInsert eingefügt werden.

                    weiß jemand wie ich dort die Option Fire_Triggers einschalte?
                    Ich hab keine Ahnung was ich tue aber ich will es lernen

                    Comment


                    • #11
                      Zeige doch mal die Sourcecodes deiner Trigger. Und wie kommst du auf die Option Fire_triggers? Es gibt maximal sowas wie ENABLE TRIGGER, aber das "feuern" geschieht durch die entsprechende Aktion (Update, Insert oder Delete).

                      bye,
                      Helmut

                      PS: vielleicht wäre es ganz gut, sich mal ein Buch über TSQL-Basics reinzuziehen

                      Comment


                      • #12
                        Option Fire_triggers
                        Siehe BOL
                        http://msdn.microsoft.com/en-us/libr...8(SQL.80).aspx
                        Einfach beim Bulk Insert als Option mit angeben, z.B.

                        BULK INSERT ... WITH ( ..., FIRE_TRIGGERS )
                        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


                        • #13
                          Cool, obwohl ich schon so viele Jahre mit dem SQL-Server arbeite ist mir das bisher noch nie aufgefallen. Man lernt eben nie aus. Nehme alles zurück und werde mir selber ein paar TSQL-Basics reinziehen (zumindest zum Thema BULK INSERT)

                          bye,
                          Helmut

                          Comment


                          • #14
                            Man lernt eben nie aus.
                            Geht mir auch nicht anders und das wird wohl auch noch bis zur Rente und darüber hinaus so bleiben; so kommt zumindest keine Langeweile auf
                            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


                            • #15
                              Hallo again,

                              wie schon gesagt ich hab den BulkInsert nicht gebaut, der wird zugeliefert
                              und mein Trigger soll nur drauf reagieren. So wie ich das versatanden haben haben die den aber mit einem DTS-Assistenten erstellt und wissen grad nicht wie sie das Fire_Triggers aktivieren.


                              weiß das einer von euch?
                              Ich hab keine Ahnung was ich tue aber ich will es lernen

                              Comment

                              Working...
                              X