Verwendetes Datenbanksystem: Microsoft SQL
Hallo,
wie kann ich mir in meinen Programm mitteilen lassen, dass es eine Änderung auf dem Server gab? Und zwar nicht Änderungen durch mich bzw. auf der aktuellen Verbindung, sondern Änderungen von irgendjemanden (zB an einem anderen Rechner). Ich habe es schon mit den beiden Events StateChange und InfoMessage probiert, die funktionieren aber anscheinend nur für die aktuelle SqlConnection bis sie disposed wird.
Danke
Hallo,
eventuell ist dein Vorhaben mit den "Notification Services" möglich. Bin mir aber nicht sicher denn auch dort wird eine Verbindung benötigt (denke ich mal).
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Irgendwie bekomme ich es nicht hin, mir wird eine Datenbankänderung zB über Sql Management Studio nie mitgeteilt.
Nicht so schön aber sollte funktionieren:
Einen Trigger auf die zu überwachenden Tabellen bauen und bei Änderungen diese in eine Changelog-Tabelle schreiben. Diese wird von einem Agent-Job abgefragt und dann z.B. ein Webservice (oder was auch immer man vom Server erreichen kann) benachrichtigt. Danach wird die Changelog-Tabelle wieder geleert oder bereits versandte Änderungen entsprechend geflagt wenn man sie aufheben möchte.
Dieser Ansatz wäre allerdings nicht "realtime". Kommt drauf an wofür du es brauchst.
Der Notification Service arbeitet meines Wissens nach ebenfalls nicht "realtime".
Ich brauche es idealerweise in Echtzeit. Ich weiß auch nicht ob SQLTrigger mir weiterhelfen, mit den Notification Services sollte es eher klappen, aber ich bekomme es nicht hin. Hat niemand einen kleinen Beispielcode für mich?
Notification Services Beispiele Allerdings sind die Notification Service ab dem 2008er SQL Server nicht mehr unterstützt.
Wenn du kriterien wie z.B. ein DateTime (besser DateTime2)-Feld in deiner Tabelle hast dann kommst du auch nur mit dem SQL Server Agent aus und brauchst keine Trigger.
"Echtzeit" würde es mit den Triggern auch gehen ich weiß aber nicht wie es dann um die Performance bei z.B. inserts bestellt ist.
Du baust z.B. einfach einen After Insert-Trigger auf die entsprechende Tabelle und benutzt dann z.B. einen SOAP Endpoint um einen Webservice aufzurufen der dann wiederum mit der zu benachrichtigenden Anwendung kommunizieren kann.
Solltest du deinen Datenzugriff sowieso schon in Stored Procedures gekapselt haben dann brauchst du gar keine Trigger.
Hallo,
Notification Services Beispiele Allerdings sind die Notification Service ab dem 2008er SQL Server nicht mehr unterstützt.
AFAIK können die 2005er aber verwendet werden.
After Insert-Trigger auf die entsprechende Tabelle und benutzt dann z.B. einen SOAP Endpoint
Gute Idee 👍
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
AFAIK können die 2005er aber verwendet werden.
Ja, geht schon aber wie lange noch? Das mussten sie wohl anbieten damit die Leute einfacher migrieren können.
Quelle: Whats new in SQL 2005 Server SP3
public void ConnectToDatabase()
{
if (IsPermissionGranted())
{
SqlDependency.Stop(_sqlConnectionString);
SqlDependency.Start(_sqlConnectionString);
using(SqlConnection sqlConnection = new SqlConnection(_sqlConnectionString))
{
using (SqlCommand cmd = sqlConnection.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = _selectStatement;
cmd.Notification = null;
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
sqlConnection.Open();
}
}
}
}
Es funktioniert jetzt! Der Fehler war mein SelectStatement, in diesem Fall wird kein * anerkannt. Meine Frage jetzt ist, wie ich mir anzeigen lassen kann, welcher Eintrag geändert wurde. Und wie kann ich einfach ein select * alles machen?