none
COLUMNS_UPDATED in einer Funktion auslagern RRS feed

  • Frage

  • Hallo, ich nutze COLUMNS_UPDATED() erfolgreich in einem Trigger. Nun muss diese Routine in eine Funktion im SQL- Server ausgelagert werden, damit auch andere Trigger diese Routine nutzen können. Ich habe im Prinzip im Trigger eine Temp-Tabelle gemacht. Diese wird dann von der ausgelagerten Funktion gefüllt. Die Routine selbst hab ich einfach mit Copy-Paste kopiert und ausgelagert. Ich übergebe lediglich den Tabellennamen. Es kommen keine Error´s hoch oder sonst was, COLUMNS_UPDATED erkennt einfach keine Veränderungen mehr, wenn ich sie in eine Function auslagere. Kann das sein, dass COLUMNS_UPDATED gar net in einer SQL-Funktion funktionieren kann, sondern in einem Trigger? Wenn ich Debuge, dann wird die Tabelle und korrekte Anzahl von Spalten erkannt, sprich kann das kein Parameter-Fehler sein. Hat da jemand nen Tipp? Danke im Voraus
    Mittwoch, 7. Dezember 2011 14:52

Antworten

Alle Antworten

  • Columns_Updated() steht nur im Trigger zur Verfügung.

    Ich halte nichts davon, Dinge wie Trigger zu globalisieren.

    Was genau willst Du denn erreichen?

    Mittwoch, 7. Dezember 2011 15:04

  • <p>Was genau willst Du denn erreichen?</p></blockquote><br/>

    Danke für deine schnelle Antwort.
    Der Gedanke ist, dass ich einige Tabellen auf ne Veränderung prüfen muss. Dies hab ich bisher in einer Tabelle mittels COLUMNS_UPDATED umgesetzt, was auch super funktioniert.
    Nun dachte ich mir einfach, ich lagere diesen Abschnitt in einer Funktion aus und nutze diese Funktion bei den anderen Triggern auch.
    Jetzt muss ich scheinbar in jedem Trigger den selben Code hinschreiben

    Mittwoch, 7. Dezember 2011 15:15
  • Mit welcher SQL Server Version arbeitest Du denn? Vielleicht wäre CDC was für Dich?

    Oder die OUTPUT-Clause?

    Ansonsten, leider, mußt Du wohl in jedem Trigger den gleichen Code reinschreiben.

    Mittwoch, 7. Dezember 2011 15:52
  • ähhmm....also ich nutze nicht die express-version.

    Sie heisst developer sql_2008 R2

    Was hat es auf sich mit CDC oder OUTPUT- Clause?

    Mittwoch, 7. Dezember 2011 17:51
  • Sie heisst developer sql_2008 R2

    Was hat es auf sich mit CDC oder OUTPUT- Clause?


    Hallo,

    die Developer Edition ist nur zum Testen & Entwickeln gedacht; ausschlaggebend ist die produktiv genutzte Edition (und das darf nicht die Developer Edition sein).

    CDC = Change Data Capture (http://msdn.microsoft.com/de-de/library/bb522489.aspx), eine Build-In Funktion in der Enterprise Edition, um Datenänderungen protokollieren zu können.

    Bei DML Aktionen wie INSERT/UPDATE/DELETE kann man sich über die OUTPUT Klause (http://msdn.microsoft.com/de-de/library/ms177564.aspx) die betroffenen Datensätze zurück geben lassen.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    • Als Antwort markiert BLRBeginner Montag, 12. Dezember 2011 21:31
    Mittwoch, 7. Dezember 2011 18:52
  • danke für die Tipps :)

    ist den CDC auch sql server 2000 abwärtskompatibel?

    Donnerstag, 8. Dezember 2011 07:08
  • Nein, wie Olaf schon ausführte, nur in SQL2008R2 Enterprise.

    Auch die Output-Klausel gibt's erst ab 2008 R2 (? bin ich jetzt nicht ganz sicher, ob das auch schon für 2008 verfügbar war). Wenn Du mit Versionen darunter arbeitest, dann mußt Du einen Trigger verwenden.

    Donnerstag, 8. Dezember 2011 07:32
  • Um es etwas zu präzisieren:

    Die OUTPUT Klausel gibt es seit SQL Server 2005 und steht in allen Editionen (exl Compact) zur Verfügung.

    CDC gibt es ab SQL Server 2008 und steht nur in der Enterprise Edition zur Verfügung.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Donnerstag, 8. Dezember 2011 17:19
  • Der Gedanke ist, dass ich einige Tabellen auf ne Veränderung prüfen muss.

    Da gibt es nur zwei Ansätze:

    1. Du speicherst deine Tabelle zwischen und vergleichst diese mit der aktuellen.

    2. Du benutze ein Auditing-Verfahren.

    Da du COLUMN_UPDATED() erwähnst, das fällt in die zweite Kategorie. Nämlich Audit-Trigger. Hier gibt es nichts, was sinnvoll ausgelagert werden kann. Allerdings kannst du diese Trigger per Code-Generierung automatisch erzeugen:

    http://sqlblog.com/blogs/paul_nielsen/archive/2007/01/15/codegen-to-create-fixed-audit-trail-triggers.aspx

    http://www.codeproject.com/KB/database/AuditTrailGenerator.aspx

    http://www.mssqltips.com/sqlservertip/1770/auto-generate-sql-server-update-triggers-for-data-auditing/

    • Als Antwort markiert BLRBeginner Montag, 12. Dezember 2011 21:32
    Freitag, 9. Dezember 2011 16:45
    Moderator