Laden...

Microsoft SQL - Datenbankänderung-Event

Erstellt von UgaAga vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.333 Views
U
UgaAga Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren
Microsoft SQL - Datenbankänderung-Event

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

6.911 Beiträge seit 2009
vor 13 Jahren

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!"

U
UgaAga Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Irgendwie bekomme ich es nicht hin, mir wird eine Datenbankänderung zB über Sql Management Studio nie mitgeteilt.

2.760 Beiträge seit 2006
vor 13 Jahren

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".

U
UgaAga Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

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?

2.760 Beiträge seit 2006
vor 13 Jahren

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.

6.911 Beiträge seit 2009
vor 13 Jahren

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!"

2.760 Beiträge seit 2006
vor 13 Jahren

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

U
UgaAga Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

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?

U
UgaAga Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Erledigt