none
Primary key bei einer UPDATE-Aktion herausfinden RRS feed

  • Frage

  • Wie erhält man Zugriff auf ein bestimmtes Feld (oder den PK?) von den Datensätzen, welche von einem UPDATE betroffen sind.

    Es soll zusätzlich zu dem Update noch ein INSERT INTO für eine andere Tabelle gemacht werden mit dem PK der betroffenen Datensätze.

    (Ich hoffe, ich habe das Problem klar genug beschrieben :-)

    Donnerstag, 4. August 2022 06:36

Alle Antworten

  • Das kommt wie immer auf die Zugriffssprache an.
    Im .Net-Umfeld ist die einfachste Möglichkeit die einfache Abfrage auf die Tabelle:

    "Select * from Tabelle"

    Mittels Command-Objekt und Execute-Reader mit dem Beavior ShemaOnly kann man dann ein DataTable-Objekt füllen lassen.
    Dieses enthält dann nur die Spaltennamen und Typen sowie in den Constraints den PrimaryKey der Felder.

    Die 2. Möglichkeit ist die Verwendung eines SQLCommandBuilders. Dem übergibt man den Select und lässt sich den Update-Befehl (sowie Delete/Insert) einfach erstellen.
    Dann kann man per DataAdapter eine DataTable oder ein DataSet per Adpater.Update() ausführen und alles passiert automatisch.

    Ansonsten bietet der Standard für SQLConnection leider nur rudimentäre Schema-Abfragen. Dazu gehört auch die fehlende Unterstützung für Index-Abfragen. Dafür gibt es im Internet aber komplexere SQL's gerade für den SQL-Server.

    Anders sieht es bei der Verwendung von COM-Schnittstellen ADODB aus.
    Hier unterstützt der SQLServer-Treiber die vollständige Schema-Abfrage von Index-Informationsn incl. Primary und Unique-Keys.

    Auch viele andere Sprachen haben ähnliche Möglichkeiten bzgl. Schemaabfragen einer Datenbank.

    Donnerstag, 4. August 2022 06:57
  • Hallo Nico,

    am einfachsten geht das über einen DML Trigger und dort über die virtuellen inserted (neue bzw. aktualisierte Datensätze) und deleted (alte bzw. gelöschte Datensätze).

    Beachte, dass hier generell mehrere Datensätze vorkommen können. So solltest Du den Trigger auch entwickeln. Wenn Du also bspw.

    UPDATE Tabelle SET Feld = Wert

    schreibst, werden alle Datensätze in der Tabelle geändert und inserted und deleted beinhalten dann auch alle alten und neuen Daten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 4. August 2022 07:35
    Moderator
  • Die Frage war ja, wie ich für den Update den Primary Key ermitteln kann um genau die eine Zeile zu ändern oder zu löschen. Was hilft mir da ein Trigger, der dann zu spät kommt?

    Wenn man ADO.Net nicht zur Hilfe hat gehts auch so:

    https://stackoverflow.com/questions/3930338/sql-server-get-table-primary-key-using-sql-query

    Donnerstag, 4. August 2022 08:11
  • Die Frage war IMHO nicht, wie ich die PK Spalten ermittele, sondern wie ich auf die Werte in den (PK) Feldern zugreifen kann, damit in einer anderen Tabelle Datensätze mit diesen Werten erzeugt werden können.

    Aber selbst wenn. Auch das würde (wenn man es denn wirklich will) mit SQL in einem Trigger gehen.

    SELECT *
    FROM   INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
    WHERE  CONSTRAINT_NAME IN (
                               SELECT TOP 1 CONSTRAINT_NAME
                               FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                               WHERE  CONSTRAINT_TYPE = 'PRIMARY KEY'
                               AND    TABLE_NAME      = '<Tabelle>'
                              )

    Aber wie gesagt, ich denke, dass das nicht die Frage des OP war. Aber das kann Nico ja dann beantworten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 4. August 2022 08:37
    Moderator
  • Stimmt, mein Fehler.

    Im Trigger kann man dann einen "insert into Ziel select x, y, z from inserted" ausführen.
    Da SQL-Server einen Update per Delete/Insert durchführt hat man im After-Trigger in "deleted" und "inserted" alle Zeilen die vom Update betroffen sind, wobei deleted die vorherigen und inserted die neuen Werte enthält.

    Ich frage mich, wann der SQL-Server mal einen echten Before-Trigger (nicht Instead) liefert, der viele Dinge vereinfachen und auch schneller machen würde.

    Donnerstag, 4. August 2022 09:20
  • Vielen Dank allen.

    Das klingt kompliziert.

    Ich habe einen Trigger erst einmal eingesetzt.

    Aber bei etwas Nachdeneken eröffnet der Trigger auc einige andere Möglichkeiten.

    Ich werde mich mal dranmachen.

    Montag, 8. August 2022 10:48