Announcement

Collapse
No announcement yet.

Update Trigger

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

  • Update Trigger

    Hallo zusammen,
    ich bin eingefleischter Oracler, mußte nun aber einen SQLServer Update Trigger bauen, der bei Update eines Feldes einer Tabelle den Datensatz wegspeichert. Anhand von Beispielen aus dem www habe ich folgendes zusammengestellt:

    create trigger raf_upd_vhsm on vhsm
    after update
    as
    set nocount on
    -- Prüft ob flag überhaupt upgedatet wurde
    if not update(flag)
    RETURN
    -- prüft ob mindestens 1 Satz dabei wo Flag von leer auf I gesetzt wurde
    if EXISTS (select * from inserted i, deleted d
    where i.codice = d.codice
    and i.flag = 'I'
    and IsNull(d.flag,'?') != 'I')
    BEGIN
    -- speichert jeden Satz weg wo Flag von leer auf I gesetzt wurde
    insert into vhsm_raf
    select i.* from inserted i, deleted d
    where i.codice = d.codice
    and i.flag = 'I'
    and IsNull(d.flag,'?') != 'I'
    END

    Der Trigger funktioniert in dieser Form sowohl beim Update eines Satzes alsauch bei einem Multirecord-Update! Vielleicht könnt Ihr aber mal einen Blick draufwerfen, ob der Trigger so optimal (=effizient) ist, ob man was verbessern oder weglassen könnte.

    Vielen Dank
    Franz

  • #2
    Hallo,

    also sicher ist das auch ein wenig "Geschmackssache", aber ich würde das so formulieren:

    [highlight=sql]

    create trigger raf_upd_vhsm on vhsm
    after update
    as
    set nocount on
    -- Prüft ob flag überhaupt upgedatet wurde
    if update(flag)
    BEGIN
    -- speichert jeden Satz weg wo Flag von leer auf I gesetzt wurde
    insert into vhsm_raf
    select i.* from inserted i, deleted d
    where i.codice = d.codice
    and i.flag = 'I'
    and IsNull(d.flag,'?') != 'I'
    END

    [/highlight]

    Warum kein RETURN
    - spätestens, wenn einmal noch ein weiteres Feld zu prüfen wäre, sorgen solche 'Sprünge' für die interessantesten Seiteneffekte; ich bin da mehr für 'immer schön der Reihen nach'

    Warum keine Prüfung mit EXISTS
    - das macht die WHERE - Klausel in der INSERT - Anweisung ja auch nochmal. Wenn da keine Sätze gefunden werden, dann 'passiert' ja auch nichts - wie gewünscht. Die erste Prüfung ist also imho redundant.

    Viel Spaß mit dem SQL Server!
    Tino

    Edit:
    [highlight=sql]IsNull(d.flag,'?') != 'I'
    [/highlight]
    Prüft allerdings nicht, ob "wo Flag von leer auf I gesetzt wurde", sondern ob flag von irgendetwas (anderem) auf I gesetzt wurde.
    Aber das bei NVL() ja wohl auch so.
    Zuletzt editiert von tinof; 16.12.2009, 09:51.
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Hallo tinof,
      danke erstmal für die Antwort!

      Warum keine Prüfung mit EXISTS
      Gibts dann auch sicher keinen Abbruch der Transaktion wenn der Insert keinen Satz beinhaltet?

      and IsNull(flag,'?') != 'I'
      Da ich nicht wußte, ob NULL != 'I' ergibt habe ich sicherheitshalber IsNull verwendet. Mir ist hier wichtig, daß alle Updates nach 'I' betroffen sind. Ein Update von 'I' nach 'I' wird wahrscheinlich nicht vorkommen (wegen if update(flag)), aber es soll auf jeden Fall nicht als Änderung erkannt werden.

      Viel Spaß mit dem SQL Server!
      Mal schauen, vielleicht will der Kunde noch andere Erweiterungen zu seinem Programm. Dieses wird nicht mehr gewartet, Hersteller und Sourcecode existieren nicht. Daher versuche ich herauszufinden was anhand der Programmabläufe in der SQLServer-DB passiert und mich dann mit eigenen Routinen einzuklinken.

      Danke
      Franz

      Comment


      • #4
        Originally posted by lagraf View Post
        Gibts dann auch sicher keinen Abbruch der Transaktion wenn der Insert keinen Satz beinhaltet?
        Nein, das ist kein Problem.


        Ja, Operatoren oder Vergleiche mit NULL sind fehlerträchtig, da ist das IsNull () sicher praktischer. Ich hab' das nur angemerkt, weil im Kommentar ..von leer.. stand - jetzt ist es klar.


        Wie gesagt, viel Erfolg beim 'reverse engeneering' - meine ersten SQL Server - Gehversuche haben ähnlich begonnen, ich mußte Zusatzprogramme zu einer bestehenden Software/Datenbank entwickeln.

        Grüße
        Tino
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          Ok und vielen Dank,
          dann ist soweit erstmal alles klar!

          Muß ich das Thema noch irgendwo als "gelöst" kennzeichnen oder ist das bei euch nicht üblich?

          Grüße
          Franz

          Comment


          • #6
            Hallo,
            Originally posted by lagraf View Post
            ...Muß ich das Thema noch irgendwo als "gelöst" kennzeichnen oder ist das bei euch nicht üblich?
            Nein, mußt du nicht.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment

            Working...
            X