Announcement

Collapse
No announcement yet.

Trigger bei MS SQL

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

  • Trigger bei MS SQL

    Hallöchen.

    Ich bin noch nicht ganz so routiniert mit dem Umgang von MS SQL und habe eine Frage zu einem Trigger.

    Ich würde gerne einen INSERT starten, wenn ein Update auf einer Tabelle ausgeführt wird.

    Aktuelle Situation:

    UPDATE auf TABELLE1 -> ein Datum mit diesem Format (04.09.2007 06:36:57) wird für eine bestimmte BenutzerId aktualisiert

    Nach dem UPDATE ein INSERT auf TABELLE2, wo dieses Datum mit der BenutzerId eingefügt wird.

    Kann mir da jemand helfen?

    Kann ich einen Trigger eigentlich datenbankübergreifend einsetzen?

  • #2
    CREATE Trigger tab1_date
    AFTER UPDATE
    ON Tab1

    AS
    DECLARE @user_id <datentyp>,
    @date DATETIME

    BEGIN
    IF UPDATE(datum)
    -- dieser Block wird nur erreicht wenn ein UPDATE auf dem Feld datum erfolgt ist
    SELECT @user_id = id FROM inserted
    SELECT @date = date FROM inserted
    -- Insert in Tab 2
    INSERT INTO Tab 2 (is,datum) VALUES (@user_id,@date)
    END

    das sollte funktionieren, ich habe bewußt Variablen deklariert und diese auch belegt, da siehste gleich wie das funktioniert.
    Man könnte die Anfragen auch direkt in das Insert statement packen.

    INSERTED entspricht der temp Tabelle in der die neuen Werte eingetragen werden.
    DELETED ist die Tabelle mit den alten Werten.

    Hoffe ich konnte dir helfen.

    LG André

    Comment


    • #3
      Vielen dank schonmal, das sieht Super aus.

      Allerdings gibt es folgendes Problem:

      CREATE Trigger MyTrigger
      AFTER
      UPDATE
      ON dbo.CurrentUserDevices

      AS
      DECLARE @userId INT,
      @LoginTime DATETIME

      BEGIN
      IF UPDATE(LoginTime)
      -- dieser Block wird nur erreicht wenn ein UPDATE auf dem Feld datum erfolgt ist
      SELECT @userId = id FROM inserted
      SELECT @LoginTime = date FROM inserted
      -- Insert in Tab 2
      INSERT INTO dbo.LoginStatus (UserId,LoginTime) VALUES (@userId,@LoginTime)
      END


      Ausgabe:

      Meldung 170, Ebene 15, Status 1, Prozedur MyTrigger, Zeile 2
      Line 2: Incorrect syntax near 'AFTER'.

      Wo liegt der Fehler.

      Und kann ich, wenn die Tabelle 1 in der Systemdatenbank "Tab1" ist, den Insert auf eine Tabelle in der Systemdatenbank "Tab2" ausführen?

      Comment


      • #4
        Ok, Problem erkannt...

        Anstelle von
        CREATE Trigger MyTrigger
        AFTER
        UPDATE
        ON dbo.CurrentUserDevices

        heisst es
        CREATE Trigger MyTrigger
        ON dbo.CurrentUserDevices
        AFTER
        UPDATE

        Allerdings, gehts trotzdem nicht!

        Comment


        • #5
          Hallo,
          was geht trotzdem nicht? Beschreib mal bitte etwas genauer.
          Vielleicht gibt es ein Problem mit den Datentypen? Ansonsten einfach ein paar ausgaben infügen, so kanste mitbekommen wo es Probleme gibt.

          Wenn ich logintime lese kann es vielleicht sein das auf der Tabelle nix geupdatet wird, sondern eher inserts stattfinden? Update ist ja nur eine veränderung eines bestehenden Tupels...
          Wenn ein insert stattfinden sollte müßtest du folgendes tun:
          ...
          IF INSERT(LoginTime)
          ...

          Comment


          • #6
            Mein MS SQL Server Management Studio sagt mir zwar, wenn ich den SQL analysierer:

            Befehl(e) wurde(n) erfolgreich abgeschlossen.


            Wenn ich ihn aber versuche auszuführen:

            Meldung 208, Ebene 16, Status 4, Prozedur MyTrigger, Zeile 1
            Invalid object name 'dbo.CurrentUserDevices'.



            Es geht aktuell um diesen String:
            CREATE Trigger MyTrigger ON [dbo.CurrentUserDevices]
            AFTER
            UPDATE


            AS
            DECLARE @userId INT,
            @LoginTime DATETIME

            BEGIN
            IF UPDATE(LoginTime)
            -- dieser Block wird nur erreicht wenn ein UPDATE auf dem Feld datum erfolgt ist
            SELECT @userId = id FROM inserted
            SELECT @LoginTime = date FROM inserted
            -- Insert in Tab 2
            INSERT INTO dbo.LoginStatus (UserId,LoginTime) VALUES (@userId,@LoginTime)
            END

            Comment


            • #7
              Interessant:

              Gerde versucht:

              CREATE Trigger MyTrigger ON IpPbx.dbo.CurrentUserDevices
              AFTER
              UPDATE


              AS
              DECLARE @userId INT,
              @LoginTime DATETIME

              BEGIN
              IF UPDATE (LoginTime)
              -- dieser Block wird nur erreicht wenn ein UPDATE auf dem Feld datum erfolgt ist
              SELECT @userId = UserId FROM inserted
              SELECT @LoginTime = LoginTime FROM inserted
              -- Insert in Tab 2
              INSERT INTO IpPbx.dbo.LoginStatus (UserId,LoginTime) VALUES (@userId,@LoginTime)
              END


              Und es kommt folgendes:

              Meldung 170, Ebene 15, Status 1, Zeile 1
              Line 1: Incorrect syntax near '.'.

              Comment


              • #8
                Hallo daPanic,

                versuche es mal mit
                CREATE Trigger MyTrigger ON dbo.[CurrentUserDevices]

                Durch die eckigen Klammern vor dem dbo. zählt das mit zum eigentlichen Tabellennamen und wird nicht als Schema-Namen interpretiert.

                Olaf.
                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


                • #9
                  Originally posted by O. Helper View Post
                  Hallo daPanic,

                  versuche es mal mit
                  CREATE Trigger MyTrigger ON dbo.[CurrentUserDevices]

                  Durch die eckigen Klammern vor dem dbo. zählt das mit zum eigentlichen Tabellennamen und wird nicht als Schema-Namen interpretiert.

                  Olaf.
                  Ausgabe:

                  Meldung 208, Ebene 16, Status 4, Prozedur MyTrigger, Zeile 1
                  Invalid object name 'dbo.CurrentUserDevices'.

                  Bei
                  CREATE Trigger MyTrigger ON dbo.[CurrentUserDevices]
                  AFTER
                  UPDATE
                  Zuletzt editiert von daPanic; 12.10.2007, 09:49.

                  Comment


                  • #10
                    Die Meldung sagt aus, das es das Objekt dbo.CurrentUserDevice in der DB nicht gibt.

                    Lass mal dbo. weg
                    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


                    • #11
                      Passiert folgendes:

                      Meldung 208, Ebene 16, Status 4, Prozedur MyTrigger, Zeile 1
                      Invalid object name 'CurrentUserDevices'.

                      Sowohl bei:
                      CREATE Trigger MyTrigger ON CurrentUserDevices
                      AFTER
                      UPDATE


                      UND


                      CREATE Trigger MyTrigger ON [CurrentUserDevices]
                      AFTER
                      UPDATE

                      Ist aber defintiv in der Datenbank, weil ich es vom Objektbroswer in die Abfrage GeDragtAndDropt habe.

                      Comment


                      • #12
                        Jawoll, Problem gefunden und gelöst.

                        Ich habe versucht aus der Master heraus auf die Datenbank zuzugreifen.

                        Wenn ich die Abfrage starte aus der Systemdatenbank heraus passt es.

                        Danke vielmals.

                        Comment


                        • #13
                          Ahja, eine Frage noch.

                          Zwei Systemdatenbanken:

                          DB1 und DB2

                          Zwei Tabellen in DB1.TAB1 und DB2.TAB2

                          Kann ich einen Trigger auf DB1.TAB1 setzen der Daten in DB2.TAB2 schreibt?

                          Comment


                          • #14
                            Ahso, ich habe eben gesehen, das ich noch das DELETE Event auf die Tabelle auswerten kann:

                            Würde der Create so aussehen?

                            CREATE TRIGGER UpdateUserLoginStatusOffline ON dbo.CurrentUserDevices
                            AFTER
                            DELETE

                            AS
                            DECLARE @userId INT,
                            @LoginTime DATETIME,
                            @LoginStatus as INT

                            BEGIN
                            -- dieser Block wird nur erreicht wenn ein DELETE auf dem Feld datum erfolgt ist
                            SELECT @userId = UserID FROM deleted
                            SET @LoginTime = getdate()
                            SET @LoginStatus = 0
                            -- Insert in Tab 2
                            INSERT INTO dbo.UserLoginStatus
                            (UserId,UserLoginTime,LoginType) VALUES (@userId,@LoginTime,@LoginStatus)
                            END
                            Zuletzt editiert von daPanic; 12.10.2007, 13:42.

                            Comment


                            • #15
                              Genau, einfach nur AFTER DELETE statt AFTER UPDATE
                              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