MSSQL Trigger Problem ...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MSSQL Trigger Problem ...

    nabend,

    wieder einmal der verflixte Montag, neben dem Freitag einer der Tage an denen nie etwas klappt *g*

    Ich hab hier nen Trigger geschrieben, der Feldwertändeurngen mitschreiben soll.

    Hier der Code:

    PHP-Code:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO

    ALTER trigger 
    [dbo].[tblAS0003_ChangeTracking_3on [dbo].[tblAS0003] for update
    AS

    -- print 
    'Trigger feuert!'
    -- Allgemeine Deklarationen für den Trigger  
    declare @bit int ,
    @
    field int ,
    @
    maxfield int ,
    @
    char int ,
    @
    fieldname varchar(128) ,
    @
    TableName varchar(128) ,
    @
    sql varchar(2000),
    @
    sqlcl varchar(2000),
    @
    UpdateDate varchar(21) ,
    @
    UserName varchar(128) ,
    @
    Type char(1) ,
    @
    PKValueSelect varchar(1000),
    @
    cnt_i varchar(128),
    @
    cnt_t varchar(128)

    select @TableName 'tblAS0003'

    -- Datum und Benutzer
    select 
    @UserName system_user ,  @UpdateDate convert(varchar(8), getdate(), 112) + ' ' convert(varchar(12), getdate(), 114)


    -- 
    Trigger-Action
    if exists (select from inserted)
    if 
    exists (select from deleted)
    select @Type 'U'
    else
    select @Type 'I'
    else
    select @Type 'D'

    -- Hole Spalten-Liste
    select id
    idusermodifycitycommemail1commemail2commemail3commfaxofficecomminternetcommphonecentral,
           
    "function"
           
    shortnamedepartment
           
    name1name2name3namefirstnamelastnamesalutationnametitlenumber,
           
    streetzipcodeb_funktion_beziehungenb_gesellschaftsanteil,
           
    buergelidbuergelstatuscrm_funktion_jfmcrm_funktion_jfpfamilienstandkundenstatus,
           
    l_adresstypl_branche1l_branche2l_branche3l_bundeslandl_fuhrparkl_kapital,
           
    l_mitarbeiterl_rechtsforml_sperrkennzl_umsatzland_privatnewsletterort_privat,
           
    plz_privatstraße_privat
      into 
    #ins from inserted
    select ididusermodifycitycommemail1commemail2commemail3commfaxofficecomminternetcommphonecentral,
           
    "function"
           
    shortnamedepartment,
           
    name1name2name3namefirstnamelastnamesalutationnametitlenumber,
           
    streetzipcodeb_funktion_beziehungenb_gesellschaftsanteil,
           
    buergelidbuergelstatuscrm_funktion_jfmcrm_funktion_jfpfamilienstandkundenstatus,
           
    l_adresstypl_branche1l_branche2l_branche3l_bundeslandl_fuhrparkl_kapital,
           
    l_mitarbeiterl_rechtsforml_sperrkennzl_umsatzland_privatnewsletterort_privat,
           
    plz_privatstraße_privat
      into 
    #del from deleted

    -- Änderungen ermitteln und Log-Eintrag vornehmen
    select 
    @PKValueSelect Id from inserted

    select 
    @field 0, @maxfield max(ORDINAL_POSITIONfrom INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

    while @field < @maxfield
    begin
      select 
    @field min(ORDINAL_POSITIONfrom INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName and ORDINAL_POSITION > @field
      select 
    @bit = (@field )% 1
      select 
    @bit power(2,@bit 1)
      
    select @char = ((@field 1) / 8) + 1


      
    if substring(COLUMNS_UPDATED(),@char1) &@bit or @Type in ('I','D')
      
      
    begin
    print 'Jetzt'
        
    select @fieldname COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName and ORDINAL_POSITION = @field
        
    print 'Feldname: ' + @fieldname
        select 
    @sql 'insert into tblAS0003_EX0013 (IdAddress, IdUserCreate, TimeCreate, AenderungVon, AenderungAm, Feld, oldvalue, newvalue) '
        
    select @sql = @sql 'select i.Id, i.IdUserModify, '
        
    select @sql = @sql '''' + @UpdateDate ''', '
        
    select @sql = @sql ' i.IdUserModify, '
        
    select @sql = @sql '''' + @UpdateDate ''', '
        
    select @sql = @sql '''' + @fieldname ''', '
        
    select @sql = @sql 'convert(char(1000),d.' + @fieldname +'),'
        
    select @sql = @sql 'convert(char(1000),i.' + @fieldname +') '
        
    select @sql = @sql ' from #ins i join #del d '
        
    select @sql = @sql 'on i.Id = d.Id'
        
    select @sql = @sql ' where i.' + @fieldname ' <> d.' + @fieldname
        select 
    @sql = @sql '    or i.' + @fieldname ' is null'
        
    select @sql = @sql '    or d.' + @fieldname ' is null'
        
    print @sql
        exec 
    (@sql)

        --
    raiserror (@sql,16,-1,@TableName)
      
    end
    end 

    Egal was ich mache ich bekomm nen Error:

    Code:
    Microsoft OLE DB Provider for SQL Server: Falsche Syntax in der nähe des 'Function'-Schlüsselwortes. [42000]=156
    Mein Kopf raucht und ich habe keine Idee mehr ....


    P.S.: Es liegt nicht an dem "Feld" "Function".

  • #2
    Gänsefüsschen hat in Transact-SQL nichts verloren

    Kommentar


    • #3
      grmls,

      Ich kann den Feldnamen "Function" aber nicht anders ansprechen, auch mit kompletten Tabellendaten gehts nicht

      Oder ich steh heute auf dem Schlauch?

      keine Ahnung....

      Kommentar


      • #4
        Es gäbe da noch das einfache Hochkomma ' und Backtick `. Schon versucht?

        Oder du benennst deine Spalte nicht wie ein reserviertes Wort. Das ist doch der Grund für dein Problem oder?

        Kommentar


        • #5
          Original geschrieben von JSkrok
          grmls,

          Ich kann den Feldnamen "Function" aber nicht anders ansprechen, auch mit kompletten Tabellendaten gehts nicht

          Oder ich steh heute auf dem Schlauch?

          keine Ahnung....
          Tja, wenn du unbedingt reservierte Wörte nehmen muss, was kein vernünftige EntwicklerInnen tun, dann solltest du zu mindest wissen, wie man sie escapen.

          Du hast hier: [dbo].[tblAS0003] schon gemacht, warum auch nicht bei dem Wort? Vielleicht siehst du jetzt ein, dass man mit Copy & Paste doch nicht sehr weit kommt

          Kommentar


          • #6
            Original geschrieben von onemorenerd
            Es gäbe da noch das einfache Hochkomma ' und Backtick `. Schon versucht?

            Oder du benennst deine Spalte nicht wie ein reserviertes Wort. Das ist doch der Grund für dein Problem oder?
            Hochkomma umschliesst Stringliteral ... und Backstick ` ist für MS-SQL ein Character wie a, b, c ...

            Kommentar


            • #7
              Wieder was gelernt. Hab mit MSSQL nix am Hut, aber trotzdem gut zu wissen.

              Kommentar


              • #8
                OffTopic:
                Obwohl das eckige Klammernpaar als Escape-Operator ja schon recht merkwürdig anmutet...

                Kommentar


                • #9
                  Original geschrieben von asp2php
                  Tja, wenn du unbedingt reservierte Wörte nehmen muss, was kein vernünftige EntwicklerInnen tun, dann solltest du zu mindest wissen, wie man sie escapen.

                  Du hast hier: [dbo].[tblAS0003] schon gemacht, warum auch nicht bei dem Wort? Vielleicht siehst du jetzt ein, dass man mit Copy & Paste doch nicht sehr weit kommt

                  Das soll jetzt nicht beleidigend klingen ... Ich arbeite mit ner Datenbankstruktur eines großen Softwareproduzenten von CRM-Systemen. Hierfür wurden Erweiterungen von einem unserer Kunden gewünscht. Wie ich oben schon geschrieben habe kann ich mal gar nichts für die Feldbezeichnungen innerhalb der Tabellen, mit denen muss ich einfach leben.

                  [dbo].[tblAS0003].[Funktion] war natürlich mein erster Einfall mit der Meldung 4104 ... also bitte nicht immer gleich maulen wenn es so aussieht als würde der Herr nur irgendwo irgendetwas herkopiert haben ....


                  Ich habe lediglich eine Frage zu einem Problem gestellt, dass mir im Moment nicht in den Sinn kommen möchte. Dafür habe ich um Hilfe gebeten, dass ihr nun meint ich würde mit copy&paste durchs Leben ziehen, will mir einfach nicht in den Kopf.

                  Kommentar


                  • #10
                    Original geschrieben von asp2php
                    Tja, wenn du unbedingt reservierte Wörte nehmen muss, was kein vernünftige EntwicklerInnen tun, dann solltest du zu mindest wissen, wie man sie escapen.

                    Du hast hier: [dbo].[tblAS0003] schon gemacht, warum auch nicht bei dem Wort? Vielleicht siehst du jetzt ein, dass man mit Copy & Paste doch nicht sehr weit kommt
                    War übrigens so gemeint, dass ich es mit der kompletten Tabellenbezeichnung schon probiert habe:

                    [dbo].[tblAS0002].[Feldname]

                    Kommentar


                    • #11
                      Ich habe lediglich eine Frage zu einem Problem gestellt, dass mir im Moment nicht in den Sinn kommen möchte. Dafür habe ich um Hilfe gebeten, dass ihr nun meint ich würde mit copy&paste durchs Leben ziehen, will mir einfach nicht in den Kopf.
                      So machen es leider eine ganze Menge Leute, darum hat asp2php so reagiert. Wenn dem nicht so ist, hast du dir ja nichts vor zu werfen

                      Kommentar


                      • #12
                        Ich find MSSQL eh kacke und ich glaube ich habe im Februar schonmal gesagt das ich damit nix mehr zu tun haben will :P

                        Kommentar


                        • #13
                          So und damit ihr nun auch die Lösung habt,

                          natürlich hole ich mir die Felder aus ner anderen Tabelle ... sollte ich vieleicht gleich drauf achten *g*

                          [deleted]
                          [inserted] sind bei Mssql die welche ich ansprechen will. Viel Wind für nichts, ich war wohl einfach übermüdet ...

                          Kommentar


                          • #14
                            *grml*

                            Ich hab da dennoch mal ne Frage (nein ich arbeite nicht täglich mit der MSSQL). Gibt es ne Möglichkeit aktuelle Querys die auf der DB ausgeführt werden zu sehen?

                            Bsp:
                            Ein Programm arbeitet auf ner DB aufm SQLServer und schickt ständig irgendwelche Querys :P nun müsst ich mal wissen WAS genau das Programm dort abfragt.

                            Gruß
                            Jan

                            Kommentar


                            • #15
                              Dafür ist der Profiler da. Damit kannst du jede Aktion protokollieren, bis ins kleinste Details. Geh bitte vorsichtig damit um, denn du kannst mit dem Profiler den Server ganz schnell die Performance berauben, wenn du übertreibst.

                              btw: es lag nicht am inserted oder deleted, erzählt mir bitte kein Märchen. Es lag an "function" und das sieht man an der Fehlermeldung!
                              Zuletzt geändert von asp2php; 18.11.2008, 13:40.

                              Kommentar

                              Lädt...
                              X