2008-09-16 3 views
0

Ich wurde aufgefordert, Code zu implementieren, der eine Zeile in einer MS SQL Server-Datenbank aktualisiert und dann ein gespeichertes Proc verwendet, um das Update in eine Verlaufstabelle einzufügen. Wir können keinen gespeicherten Prozess hinzufügen, da wir die Datenbank nicht steuern. Ich weiß in gespeicherten Procs können Sie das Update durchführen und dann auf einem anderen gespeicherten Proc ausführen aufrufen. Kann ich es in Code mit einem SQL-Befehl einrichten?Eine Einfügung ausführen und dann einen SQL-Befehl anmelden

Antwort

1

Entweder führen Sie beide in der gleichen Anweisung (trennen Sie die separaten Befehle durch ein Semikolon) oder verwenden Sie eine Transaktion, so dass Sie die erste Anweisung zurücksetzen können, wenn der 2. fehlschlägt.

+0

Gab dir das akzeptieren, da dies mich auf den richtigen Weg gebracht hat. Vielen Dank. – osp70

0

Sie können auch SQL-Trigger erstellen.

+0

Wenn er nicht eine gespeicherte Prozedur erstellen, er kann mit ziemlicher Sicherheit keinen Trigger – foxxtrot

0

Abhängig von Ihrer Bibliothek können Sie normalerweise beide Abfragen in eine Befehlsstring setzen, getrennt durch ein Semikolon.

+0

Dank erstellen, dann ist es MS SQL vb.net mit 2005. Ich werde das Semikolon versuchen. – osp70

0

Unzureichende Informationen - welcher SQL Server? Warum haben Sie eine Verlaufstabelle?

Auslöser werden so etwas tun. MySQL's binlog könnte für Sie nützlicher sein.

Sie sagen, dass Sie die Datenbank nicht kontrollieren. Kontrollieren Sie den Code, der darauf zugreift? Fügen Sie die Protokollierung dort hinzu und halten Sie sie vollständig vom SQL-Server fern.

+0

Die Protokolltabelle wird von der Anwendung verwendet, um Aktualisierungen der Elemente anzuzeigen. Nicht nur ein Transaktionsprotokoll für die Wiederherstellung. – osp70

1

Sie brauchen nicht wirklich ein gespeichertes proc für dieses. Die Frage läuft wirklich darauf hinaus, ob Sie Kontrolle über alle Einsätze haben oder nicht. Wenn Sie tatsächlich auf alle Einfügungen zugreifen können, können Sie einfach eine Einfügung in die Datentabelle und eine Einfügung in die Verlaufstabelle in einer einzigen Transaktion einfügen. Dadurch wird sichergestellt, dass beide für den Erfolg abgeschlossen werden. Wenn Sie jedoch innerhalb einer Transaktion sequenziell auf Tabellen zugreifen, müssen Sie sicherstellen, dass Sie die Historientabelle und die Datentabelle nicht sperren, da andernfalls eine Deadlock-Situation auftreten könnte.

Wenn Sie jedoch keine Kontrolle über die Einfügungen haben, können Sie bestimmten db-Systemen einen Trigger hinzufügen, der Ihnen Zugriff auf die geänderten, eingefügten oder gelöschten Daten gewährt. Es gibt Ihnen möglicherweise alle Daten, die Sie benötigen, z. B. wer die Einfügung durchgeführt, aktualisiert oder gelöscht hat, aber es wird Ihnen sagen, was sich geändert hat.

0

Vielen Dank für Ihre Antwort, unten ist eine Zusammenfassung dessen, was ich getan habe. Jetzt testen, um zu sehen, ob das Trans im Falle eines Fehlers tatsächlich zurückgesetzt wird.

sSQL = "BEGIN TRANSACTION;" & _ 
      " Update table set col1 = @col1, col2 = @col2" & _ 
      " where col3 = @col3 and " & _ 
      " EXECUTE addcontacthistoryentry @parm1, @parm2, @parm3, @parm4, @parm5, @parm6; " & _ 
      "COMMIT TRANSACTION;" 
+0

Yep, löschte die gespeicherte proc in meiner Testumgebung und wenn die sql einen Fehler warf, muss das Update zurückgerollt werden, da die Info die gleiche wie der Start war. Danke allen! – osp70

Verwandte Themen