Announcement

Collapse
No announcement yet.

kleines Trigger-Problem

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

  • kleines Trigger-Problem

    Hallo zusammen,

    ich benötige einen Trigger auf eine Tabelle, der mir in eine Historien-tabellle einen Datensatz anlegt. Aber nur, wenn Spalte 6 nicht geändert wurde.

    Mein Versuch bisher:

    [highlight=mssql]
    ALTER TRIGGER [dbo].[AfterUpdateBenutzer] ON [dbo].[Benutzer] AFTER UPDATE AS
    IF (COLUMNS_UPDATED() & 32) <> 32
    BEGIN
    INSERT INTO [dbo].[BenutzerHistorie] SELECT 2, GETDATE(), * FROM INSERTED
    END;
    [/highlight]

    die 32 ergibt sich aus der Umrechnung: 2^(Spalte-1) = 2^(6-1) = 32
    So hab ich zumindest verstanden, muss ich Spalte 6 ansprechen.

    Kann mir jemand sagen was ich da falsch mache?

  • #2
    Ist es den wirklich die Spalte Nr. 6?

    select COLUMNPROPERTY(Object_ID('AfterUpdateBenutzer'), 'HierDenFeldnamen', 'ColumnId')
    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
      select COLUMNPROPERTY(Object_ID('Benutzer'), 'LetzteAnmeldung', 'ColumnId') as ColumnId

      Da kommt immer NULL als Ausgabe, aber die Spalte existiert definitiv
      Zuletzt editiert von Andreas Mahr; 09.12.2008, 16:36.

      Comment


      • #4
        Bei mir wird auch NULL ausgegeben ... wenn ich es auf einem SQL2000 ausführe (wir sind hier in der 2005 Rubrik, deswegen nahm ich das so auch an)

        Dann EXEC sp_help 'Benutzer'
        in der Hoffnung, das die Felder wirklich in der Reihenfolge ausgegeben werden.
        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
          oh, verdammt, du hast Recht. Mein lokaler SQL-Server ist 2005, aber der auf den ich zugreife ist ein 2000er...sorry, da hab ich nicht mehr dran gedacht

          Comment


          • #6
            Ich "reite" auf dem Thema ID auch nur rum, weil in der BOL2005 steht, das die "Ordinate" aus

            select *
            from INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_Name = 'Benutzer'
            ORDER BY ORDINAL_POSITION

            nicht mit der Column_ID übereinstimmen muss und das das Problem sein könnte.
            Denn ansonsten sieht Dein Trigger ok aus.
            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


            • #7
              hmm...die Ordinal_Position der Spalte ist 6
              kann es sein, das der Trigger unter 2000 einfach nicht funktioniert? Er macht das INSERT immer, egal in welcher Spalte ich etwas ändere, also auch in Spalte 6 und genau da soll er ja eigentlich nicht.

              Comment


              • #8
                Hast du es schon mal so probiert:

                IF NOT UPDATE(Feldname) INSERT ....

                bye,
                Helmut

                Comment


                • #9
                  Das funktioniert auch unter SQL 2000, gerade getestet (man, muss ich Langeweile haben )

                  [highlight=SQL]USE tempdb

                  CREATE TABLE myData
                  ( myID int IDENTITY(1,1),
                  Feld1 varchar(20) NULL,
                  Feld2 varchar(20) NULL,
                  Feld3 varchar(20) NULL)
                  GO

                  CREATE TABLE myAction
                  (myID int,
                  Feld varchar(20) NULL,
                  myActionDate datetime DEFAULT GetDate())
                  GO

                  INSERT INTO myData (Feld1, Feld2, Feld3) VALUES ('A','A','A');
                  INSERT INTO myData (Feld1, Feld2, Feld3) VALUES ('B','B','B');
                  INSERT INTO myData (Feld1, Feld2, Feld3) VALUES ('C','C','C');
                  GO

                  CREATE TRIGGER MyTest ON myData AFTER UPDATE
                  AS
                  BEGIN
                  IF (COLUMNS_UPDATED() & 4) <> 4
                  BEGIN
                  INSERT INTO myAction (myID, Feld)
                  SELECT myID, Feld1 FROM INSERTED;

                  INSERT INTO myAction (myID, Feld)
                  SELECT myID, Feld1 FROM DELETED

                  END
                  END
                  GO

                  UPDATE myData SET Feld1 = 'X' WHERE Feld1 = 'A';
                  UPDATE myData SET Feld2 = 'Y' WHERE Feld2 = 'B';
                  UPDATE myData SET Feld3 = 'Z' WHERE Feld3 = 'C';
                  GO

                  SELECT *
                  FROM myAction
                  GO

                  DROP TABLE myData
                  DROP TABLE myAction
                  [/highlight]

                  Ergebnis:
                  [highlight=code]myID Feld myActionDate
                  ----------- -------------------- -------------------------
                  1 X 2008-12-09 16:29:37.420
                  1 A 2008-12-09 16:29:37.420
                  3 C 2008-12-09 16:29:37.433
                  3 C 2008-12-09 16:29:37.433
                  [/highlight]
                  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


                  • #10
                    ok, das ganze hat sich geklärt. Da lag ein Fehler bei der Bitweisen Verknüpfung vor. Wenn man mehr wie 8 Spalten hat (in meinem Fall 35) dann muss man mit SUBSTRING arbeiten. Deswegen hat es bei mir nie funktioniert.

                    Comment

                    Working...
                    X