Announcement

Collapse
No announcement yet.

Trigger

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

  • Trigger

    Hallo zusammen,
    ich möchte einen Trigger bauen, der ein GatDate() über die Spalte Erledigt am macht, aber nur wenn ein Wert in Erledigt eingetragen wird. Des weiteren soll bei allen Änderungen des Datensatzes ein GetDate() über die Spalte einDatum und suser_sname() in einUser erfolgen, außer wenn etwas in die Spalte Erledigt eingetragen wird..

    Kann man dies in einem Trigger lösen?

    Mein Ansatz wäre:

    CREATE TRIGGER trg_Insert_Update_Datum_User_Eingang ON dbo.Eingang
    After INSERT, UPDATE
    AS
    BEGIN
    SET NoCount ON
    UPDATE Eingang
    SET einDatum = GETDATE(), einUser = (host_name() + ' - ' + suser_sname())WHERE IDE IN (SELECT IDE FROM inserted) AND Erledigt = Null
    SET ErledigtAm = GETDATE() WHERE IDE IN (SELECT IDE FROM inserted) AND Erledigt Not Null
    SET nocount OFF
    END;

    Ich bekomme aber eine Fehlermeldung... Wo mache ich den Fehler?

  • #2
    Hallo,

    vermutlich ist die Abfrage mit "Erledigt = null" verkehrt. Das muss lauten "Erledigt is null". Probiers mal aus...

    Gruß
    Thomas

    p.s.: am Schluss wird dass dann noch so geschrieben... (Update Eingang und is vergessen)

    Update Eingang
    SET ErledigtAm = GETDATE() WHERE IDE IN (SELECT IDE FROM inserted) AND Erledigt is Not Nul

    Comment


    • #3
      Ich habe wie folgt geändert:
      CREATE TRIGGER trg_Insert_Update_Datum_User_Eingang ON dbo.Eingang
      After INSERT, UPDATE
      AS
      BEGIN
      SET NoCount ON
      UPDATE Eingang
      SET einDatum = GETDATE(), einUser = (host_name() + ' - ' + suser_sname())WHERE IDE IN (SELECT IDE FROM inserted) AND Erledigt is Null
      SET ErledigtAm = GETDATE() WHERE IDE IN (SELECT IDE FROM inserted) AND Erledigt is Not Null
      SET nocount OFF
      END;

      und bekomme folgenede Fehlermeldung:
      Server: Nachr.-Nr. 170, Schweregrad 15, Status 1, Prozedur trg_Insert_Update_Datum_User_Eingang, Zeile 8
      Zeile 8: Falsche Syntax in der Nähe von '='.
      Server: Nachr.-Nr. 156, Schweregrad 15, Status 1, Prozedur trg_Insert_Update_Datum_User_Eingang, Zeile 8
      Falsche Syntax in der Nähe des AND-Schlüsselwortes.

      Sollte dein p.s. nen joke sein, oder wie habe ich das zu verstehen ..

      Comment


      • #4
        Hallo,

        hier mal komplett:

        CREATE TRIGGER trg_Insert_Update_Datum_User_Eingang ON dbo.Eingang
        After INSERT, UPDATE
        AS
        BEGIN
        SET NoCount ON

        UPDATE
        Eingang
        SET
        einDatum = GETDATE(),
        einUser = (host_name() + ' - ' + suser_sname())
        WHERE
        IDE IN (SELECT IDE FROM inserted) AND
        Erledigt is Null

        UPDATE
        Eingang
        SET
        ErledigtAm = GETDATE()
        WHERE
        IDE IN (SELECT IDE FROM inserted) AND
        Erledigt is Not Null

        SET nocount OFF
        END;

        Gruß
        Thoma

        Comment


        • #5
          Danke...
          Die Syntax ist Ok. Aber meine Überlegung/Bedingung:

          WHERE
          IDE IN (SELECT IDE FROM inserted) AND
          Erledigt is Null

          ist nicht OK.

          Das Update soll immer erfolgen wenn eine Änderung am Datensatz erfolgt ausser wenn sich etwas in der Spalte Erledigt ändert.....

          Gibt es eine Möglichkeit die Bedingung so Aufzustellen sodas das update nicht erfolgt wenn in der Spalte Erledigt eine Änderung erfolgt

          Comment


          • #6
            Hallo,

            >..wenn in der Spalte Erledigt eine Änderung erfolgt?

            Innerhalb eines Triggers stellt der SQL Server die Funktion <b>UPDATE</b> (nicht zu verwechseln mit der UPDATE-Anweisung von SQL) zur Verfügung, um zu prüfen, ob eine bestimmte Spalte von der Triggerauslösenden Aktion über eine INSERT- oder UPDATE-Anweisung beschrieben wurde:

            <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">CREATE TRIGGER </span>trUpdateTriggerDemp_UPD </p><p style="margin: 0px;">&nbsp; <span style="color: blue;">ON </span>dbo.UpdateTriggerDemo</p><p style="margin: 0px;">&nbsp; <span style="color: blue;">FOR UPDATE</span></p><p style="margin: 0px;"><span style="color: blue;">AS</span></p><p style="margin: 0px;">&nbsp; <span style="color: blue;">IF UPDATE</span>(wert)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">PRINT </span><span style="color: maroon;">'Die Spalte wert wurde geändert'</span>;</p><p style="margin: 0px;">&nbsp; <span style="color: blue;">IF UPDATE</span>(datum)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">PRINT </span><span style="color: maroon;">'Die Spalte datum wurde geändert'</span>;</p><p style="margin: 0px;">GO</p></div&gt

            Comment


            • #7
              OK. Danke....
              Mein Trigger sieht jetzt wie folgt aus und scheint auch zu funktionieren:

              Alter TRIGGER trg_Insert_Update_Datum_User_Eingang ON dbo.Eingang
              FOR UPDATE
              AS
              BEGIN
              SET NoCount ON

              IF not UPDATE(Erledigt)
              UPDATE Eingang
              SET einDatum = GETDATE(), einUser = (host_name() + ' - ' + suser_sname()) WHERE IDE IN (SELECT IDE FROM inserted)

              IF UPDATE(Erledigt)
              UPDATE Eingang
              SET ErledigtAm = GETDATE() WHERE IDE IN (SELECT IDE FROM inserted) AND Erledigt is Not Null

              SET nocount OFF
              END;

              Nochmals vielen Dank für eure Bemühungen..

              Comment


              • #8
                Sieht doch gut aus

                Gruß
                Thoma

                Comment

                Working...
                X