Announcement

Collapse
No announcement yet.

Trigger im SQL-Server 2000

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

  • Trigger im SQL-Server 2000

    Hallo zusammen,
    ich möchte einen Trigger erzeugen der folgendes macht:

    Ich habe eine Spalte dDatum, dUser und dWorkstation.
    1. Wenn in der Spalte dDatum etwas eingetragen wird, soll diese nicht überschrieben werden. Es soll aber dUser und dWorkstation automatisch eingetragen werden.
    2. Wenn in der Spalte dDatum nichts eingetragen wird, sollen alle drei Spalten automatisch gefüllt werden.
    Mein Ansatz sieht wie folgt aus:

    Code:
    CREATE TRIGGER trg_Insert_UpdateTest ON dbo.Test
    After INSERT, UPDATE
    AS
    DECLARE @UpdateDatum BIT
    SET @UpdateDatum = 0
    
    SET TRANSACTION Isolation LEVEL READ Committed
    BEGIN TRAN
    	BEGIN
    		SET NoCount ON
    
    		SELECT IDD FROM Test WHERE IDD IN (SELECT IDD FROM inserted)AND dDatum IS NOT NULL
    		IF @@ROWCOUNT > 0
    			SET @UpdateDatum = 1
    
    		IF @UpdateDatum = 0
    			BEGIN
    				UPDATE Test	SET dDatum = GETDATE(), dUser = SUSER_SNAME(), dWorkstation = HOST_NAME() WHERE IDD IN (SELECT IDD FROM inserted)
    		END
    
    		IF @UpdateDatum = 1
    			BEGIN
    				UPDATE Test	SET dUser = SUSER_SNAME(), dWorkstation = HOST_NAME() WHERE IDD IN (SELECT IDD FROM inserted)--  AND dDatum is Not Null	
    			END
    		SET nocount OFF
    	END
    IF @@ERROR  <> 0
    	ROLLBACK TRAN
    ELSE
    	COMMIT TRAN
    Der Trigger funktioniert zwar, aber ich bin mir nicht sicher ob das so Sinnvoll ist. Vielleicht hat jemand eine Idee wie man das besser macht....
    ...wenn es nur so geht, wäre es ebenfalls toll wenn ihr mich das wissen lasst....

    Danke

  • #2
    Hallo M Merlin,

    eigntlich kannst Du die vorherige Selektion und die Fallunterscheidung weg lassen, das geht für diesen Fall etwas einfacher mit

    [highlight=sql]UPDATE Test
    SET dDatum = ISNULL(dDatum, GETDATE()),
    dUser = SUSER_SNAME(),
    dWorkstation = HOST_NAME()
    WHERE IDD IN (SELECT IDD FROM inserted)
    [/highlight]
    Zwar wird so das Feld dDatum immer mit upgedatet, das "frist aber kein Brot" und geschieht mit dem richtigen Wert.

    Und bedenke immer,das in INSERTED 1-n Datensätze stehen können, also auch wo dDatum mal NULL ist und wo mal ein Wert steht.
    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


    • #3
      Das ist schon wichtig, wenn ich ein Datum reinschreibe, dass diese nicht überschrieben wird.

      Denn ich schreibe das Datum bewusst darein. Es ist dann nicht das aktuelle Datum sondern, das richtige Erstellungsdatum. Die Daten werden dann, z.B. wenn Netzt weg ist zwischengespeichert und dann wie beschrieben mit dem richtigen Datum/Uhrzeit versehen...

      Also, benötige ich schon ne Lösung wo das Feld nicht überschrieben wird wenn ich explizit was reinschreibe....

      Comment


      • #4
        Dann passt meine Lösung schon, die macht es so.

        dDatum = ISNULL(dDatum, GETDATE())

        ISNULL prüft dDatum ob es NULL ist, wenn ja wird GETDATE verwendet, sonst dDatum selbst

        Test:
        select ISNULL(cast('20090101' as datetime), getdate())
        select ISNULL(NULL, getdate())
        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


        • #5
          Ok. Habs getestet. Funktioniert gut...

          Danke

          Comment

          Working...
          X