Fragensteller
Primary key bei einer UPDATE-Aktion herausfinden

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 :-)
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.
-
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
- Bearbeitet Stefan FalzModerator Donnerstag, 4. August 2022 07:35
-
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
- Bearbeitet Der Suchende Donnerstag, 4. August 2022 08:13
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 8. August 2022 09:52
-
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.