Laden...

[MS-SQL 2k5] Datenbank-Events

Erstellt von Fabian vor 17 Jahren Letzter Beitrag vor 16 Jahren 8.228 Views
Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 17 Jahren
[MS-SQL 2k5] Datenbank-Events

Hallo zusammen,

ich habe eine Frage zum MS SQL Server 2005: Gibt es eine Art Event, die von der Datenbank geworfen werden, wenn sich beispielsweise eine Tabelle ändert? Reagieren müsste ich auf ein Insert und ein Update. Das Update nur auf einer bestimmten Spalte.

Gefunden habe ich zu dem Thema noch nichts.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

B
107 Beiträge seit 2006
vor 17 Jahren

Als Stichwort wäre NotificationServices zu nennen, damit kannst du die Events in deinem Programm abonnieren.

Willst du innerhalb der Datenabnk reagieren nimmst du Trigger.

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 17 Jahren

Hallo bonnet,

danke für die Antwort. Ich will außerhalb, in einer anderen Applikation reagieren. Ich werde mal nach NotificationServices suchen.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

1.134 Beiträge seit 2004
vor 17 Jahren

Hi

weiß jemand ob es es notification services auch für Oracle Datenbanken gibt ?

Mein Stackoverflow Profil
Skype Name : Boas.Enkler (bitte einen hinweis in der Kontaktanfrage damit ich euch vom Spam unterscheiden kann)

S
8.746 Beiträge seit 2005
vor 17 Jahren

Meines Wissens ist das ein Feature welches z.Z. ausschließlich der MS SQL-Server beherrscht. Zudem läuft der Event meines Wissens immer in einem im SQL Server gehosteten Assembly auf. Willst du eine externe App benachrichtigen, musst du den Event von dort weiterleiten.

347 Beiträge seit 2006
vor 17 Jahren

Original von Haggy
weiß jemand ob es es notification services auch für Oracle Datenbanken gibt ? In Oracle hast du seit eh und je DBMS_Pipe zur sofortigen asynchronen Kommunikation, oder DBMS_Alert für transaktionale Events.
Dummerweise gibt es keine Oracle Zugriffskomponenten, die über das absolute Minimunm an Funktionalität hinausgehen. Ich habe noch keine Ora Events mit .Net abfangen wollen, aber es würde mich doch sehr überraschen, wenn es dafür eine API gibt.
Du kannst genauso gut auch einfach per TCP/UDP deinen AppServer benachrichtigen.

Solche Späße haben aber IMHO rein gar nix in einer DB zu suchen. Sowas lässt sich viel schöner im AppServer lösen.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Original von Robert G
Sowas lässt sich viel schöner im AppServer lösen.

Das sehe ich prinzipiell genauso. Die Events könnte man allerdings dort sinnvoll einsetzen, wo einer AppServer eine entsprechende Funktionalität nicht bietet (oder gar keiner existiert) und auch nicht angepasst werden kann, aber nachträglich Event-Dienste eingezogen werden sollen. Man sollte aber tunlichst keine Applikationslogik über Events realisieren (das sollte dem AppServer vorbehalten bleiben), sondern eher Geschichten wie Reporting (z.B.: Eintrag in der Fehlertabelle führt zu einer Mail an den System-Admin).

Auch wenn verschiedene AppServer eine DB beackern, könnte die Zentralisierung solcher Dienste via Events Sinn machen.

121 Beiträge seit 2006
vor 17 Jahren

Hallo,

da scheinbar die Notification Services nur Events innerhalb des SQL Servers auslösen, und diese dann nur über Umwege eine externe Anwendung anstoßen könnten, kommen sie für mich erst mal nicht in Betracht, so schön die Idee auch sein mag.

Jetzt fand ich aber einen anderen myCSharp.de-Beitrag, in dem M@TUK einen Hinweis zur SQLDependency-Klasse gibt. (Verwenden von Abfragebenachrichtigungen)

Vielleicht ist die SQLDependency Klasse besser geeignet, eigenständige, d.h. vom SQL Server losgelöste Anwendungen bei Datensatzänderungen zu benachrichten.

Gruß Hape

M
402 Beiträge seit 2005
vor 17 Jahren

Original von hape
Vielleicht ist die SQLDependency Klasse besser geeignet, eigenständige, d.h. vom SQL Server losgelöste Anwendungen bei Datensatzänderungen zu benachrichten.

Jap... sollte genau das vermögen...

Es gibt von auf der Microsoft-Webseite einen Webcast von Ralf Westphal
der sich unter anderem mit dieser SQLDependency-Klasse beschäftigt.

http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=118758891

BTW: Ich kann generell jedem der im einen oder anderen Bereich noch wenig
programmiert hat sich mal ein paar MSDN - Webcasts reinzuziehen. Bringt wirklich was, ist aber dafür etwas zeitintensiv.

Grüsse

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 17 Jahren

Hallo M@TUK,

danke für den Link. Interessanter Webcast.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

E
17 Beiträge seit 2006
vor 17 Jahren
Typiserte Datasets

Hi,

ich versuche gerade die SQLDependency mit einem typisierten Dataset zu erstellen. Leider schlugen alle meine Versuche bisher fehl. Alle Ansätze, die ich gefunden habe, nutzen das Command-Objekt des Datasets. An das komme ich jedoch bei typisieren Datasets nicht ran.
Leider konnte ich auch nirgends was dazu finden. Sollte es etwa sein, das ein mit VS2005 eingeführtes neues feature nicht mit der ebenfalls neuen SQLDependency-Klasse verträgt???

Für Hinweise wär ich echt dankbar.

F
107 Beiträge seit 2006
vor 17 Jahren

Hi, du brauchst doch kein DataSet um das SQlDependency zu erstellen, nur irgendein Command-Objekt.

Hab das nach nem Beispiel-Code aus nem Buch von Microsoft-Press gemacht.



using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Security.Permissions;

namespace ConsoleApplication1
{
    class Program
    {
        private static SqlDependency dep = null;
        static bool change = false;
       

        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection(getConnectionString());
            conn.Open();
             SqlDependency.Start(ConnectionString);

            while (true)
            {
                                change = false;
                SqlCommand cmd = new SqlCommand(selectbefehl)
                
                dep = new SqlDependency(cmd);
                dep.OnChange += new OnChangeEventHandler(dep_OnChange);
                cmd.ExecuteNonQuery();
                
               
                while (!change)
                {
                    System.Threading.Thread.Sleep(1000);
                    Console.Write("\n.");
                }
        
             }
               

                
        }
        static void dep_OnChange(object sender, SqlNotificationEventArgs e)
        {           
            Console.Write(e.Source.ToString());
            Console.Write(e.Type.ToString());
            Console.Write(e.Info.ToString());
                        change = true;
        }
               

    }
}



Für den SELECT-Befehl gibts aber einige Einschränkungen, du darfst zb. kein * benutzen und vor dem Tabellenname musst du dbo. vorne anfügen.
Und wenn du String-felder überwachen willst funktioniert es auch nicht.

ich hoffe ich konnte dir helfen

mfg Flo

F
10.010 Beiträge seit 2004
vor 17 Jahren

@eichbaum:

Ja klar kann das sein.
Die beiden sachen sind ja auch für verschiedene Zielgruppen.

Die TableAdapter und Co sind für einsteiger, die nicht wissen wie das alles zusammenhängt,
oder für Leute, die mal eben eine DB-Anwendung zusammenklicken wollen.

SQLDependency ist für Leute, die genau wissen was Sie wollen, und die
verstanden haben wie das alles zusammenhängt.

E
17 Beiträge seit 2006
vor 17 Jahren

Hi,

Danke für Eure Antworten!

@FZelle
Ich finde das die Erstellung eines typisierten Datasets mit VS2005 wunderbar schnell geht. Das nimmt einem viel Arbeit ab. Daher fände ich diesen Zusatz noch die Krönung.

E
17 Beiträge seit 2006
vor 17 Jahren

@Flo80
Ich habe aber schon einige Datasets die meine Applikationsdaten beinhalten. Daher wäre die Kombination Datasets mit Applikationsdaten und "SQL-Watchdog" ideal.

Natürlich könnte ich die wichtigsten Datengruppen gesondert als Beobachtung einbringe - das wäre natürlich noch eine Idee... ?!?

F
10.010 Beiträge seit 2004
vor 17 Jahren

Ich habe ja auch nicht gesagt, das das nicht ginge, aber dann müsstest Du wissen was Du tust,
bzw die gesamten Grundlagen verstanden haben.

E
17 Beiträge seit 2006
vor 17 Jahren

*grübel*

Sorry - ich versteh Deine letzte Aussage nicht ganz. Nur Damit ich Dich richtig verstehe:
A) Du weißt es nicht genau, obs Geht. Es kann also sein, das es doch geht. Es kann aber auch sein das nicht.
B) Jeder Entwickler hat die Möglichkeit nicht den schnellen Weg zu wählen indem er seine Datasets "eigenhändig" mit DataAdaptern, Connections, Updateroutinen etc. zu8sammenstellt.

F
10.010 Beiträge seit 2004
vor 17 Jahren

Klar weiss ich wie es geht.

Ich wollte damit sagen, das Du dich entscheiden musst:

  1. Weiterhin alles zusammenzuclicken, ohne zu verstehen wie da was zusammenhängt, oder

  2. Dich mit den Grundlagen beschäftigst, verstehst wie ein TableAdapter
    aufgebaut ist, was SqlDep. benötigt, und wie Du das dann einbaust.

Aber ohne lernen, wird das nichts.

Nimm Dir doch mal die Hilfe zu SqlDependency vor.
Dann wirst Du sehen wie Du da ein Event bekommst, wenn sich "etwas" Ändert.
Dann schau mal den generierten Code eines TabelAdapters an.
Und wenn dann die "Groschen" fallen, ist es doch ein schönes Erlebnis.

E
17 Beiträge seit 2006
vor 17 Jahren

Hi,

das Du weisst wies geht ist mir klar - ich habe mich ja auch dierekt auf schon typisierte Datasets bezogen.

Mir ist schon klar wie ich das ganze aufbauen soll. Ich bin sogar so kühn zu behaupten das ich die Zusammenhänge zwischen TableAdapter, Dataset, SQLConnection etc. verstanden habe.

Mein Problem ist jedoch das ich die beiden zum Aufbau benötigen Dinge nicht aus einem automatisch generierten Dataset mit TableAdapter herausbekomme. Sobald icht etwas am Quellcode von datasetXY.designer.cs ändere wird das beim nächten Build überschrieben. Damit kann ich nachträglich auch nicht "händisch" die SQLDependency einbauen.
Ein Zugriff "von Aussen" auf den SELECT-Teil des Adapters ist nicht möglich (Protected). Sollte ich hierbei etwas übersehen haben klär mich bitte auf - ich bin immer auf der Suche um etwas neues zu lernen.

Wie machst Du denn das? Baust Du Deine DataSets und Adapter immer per Hand?

Gruß

F
10.010 Beiträge seit 2004
vor 17 Jahren

Ich mache nie etwas immer, sondern angepasst zur Situation.

Aber hast Du schon mal geschaut was das Wort "partial" in einer Klassendeklaration macht?
Ist genau hierfür eingeführt worden.

E
17 Beiträge seit 2006
vor 17 Jahren

Hi,

ich sehe Du nimmst es mit den Worten (Stichwort immer) sehr genau 😉

Yepp - das partial habe ich in anderm Kontext schon im Einsatz. (Ausser bei den Formularen) g

Dann werde ich mein Augenmerk nochmals darauf lenken - mein bisheriger Ansatz war da anscheinend net wirklich passend.

Danke für den Tipp.

Gruß

N
59 Beiträge seit 2008
vor 16 Jahren

Ich habe mir anhand SQLDependency eine Überwachung für eine Testdatenbank aufgebaut.

Die Methode


private void dependency_OnChange(object sender, SqlNotificationEventArgs e)

wird jedoch viel zu oft aufgerufen, der Counter geht schnell in die Tausende.

Kann es sein, daß die Methode (so wie sie in der msdn erklärt wird) alle Änderungen auf dem kompletten DB-Server abfängt? Wenn ja, wie kann ich dies unterbinden?

Da mein SQL-String nur eine Spalte einer Tabelle ausließt kann es daran nicht liegen.

J
1.114 Beiträge seit 2007
vor 16 Jahren

Bist du sicher dass du deine 2005er SQL Datenbank auch im SQL 2005 Modus betreibst. Ich hatte das Problem anfangs auch.

Es ist ausserdem notwendig, dass du die fullqualified Tabellennamen in deinem Query angibst, also dbo.Tabellenname.

N
59 Beiträge seit 2008
vor 16 Jahren

Vor allen Tabellennamen steht dbo.
Aber man muß doch festlegen können welche Änderungen er melden soll. Bei mir wäre es nur ein Feld in einer Tabelle.
Nur weiß ich nicht wo und wie ich das kann.

J
1.114 Beiträge seit 2007
vor 16 Jahren

Du wirst benachrichtigt bei jeder Änderung, die deine auf Client Seite geladene Ergebnismenge betrifft.

Hast du den DB Modus gecheckt?

N
59 Beiträge seit 2008
vor 16 Jahren

Du hast mich gerade auf eine andere Idee gebracht 😉

Select *

war der Fehler...mit nem wohldefinierten Select geht es nun wunderbar, danke 🙂

Woher weiß ich dann eigendlich welches Feld hinzugekommen ist, kann man den Primärschlüsse "abfangen"?

J
1.114 Beiträge seit 2007
vor 16 Jahren

Da mein SQL-String nur eine Spalte einer Tabelle ausließt kann es daran nicht liegen.

und

Select *

war der Fehler...mit nem wohldefinierten Select geht es nun wunderbar, danke

Deine Aussagen widersprechen sich an der Stelle ein bischen 🤔
Hätte ich dir eigentlich auch gleich sagen können, bin aber davon ausgegangen, dass du eh nur einige Spalte ausliest, und somit ein Select * ausgeschlossen ist.

Aber ja, du musst alle Spalten namentlich angeben.

N
59 Beiträge seit 2008
vor 16 Jahren

in der tabelle steht nur eine spalte und die habich mit select * ausgelesen 😠

das problem was ich aber nun habe ist, daß ich zwar weiß, daß ein eintrag hinzugekommen ist aber ich nicht weiß welcher das ist

J
1.114 Beiträge seit 2007
vor 16 Jahren

Wer sagt denn dann einer, oder NUR einer hinzugekommen ist. Kann ja auch was gelöscht sein, oder geändert sein...

du kommst also um einen Vergleich mit deiner vorherigen Datenmenge nicht drumrum... Wenn du als PK eine fortlaufende Nummer gewählt hast, kannst du so versuchen, dir alle Records zu holen mit PK > deinem letzten.

N
59 Beiträge seit 2008
vor 16 Jahren

Schade, ich dachte man könnte evtl direkt auf eine Variable zugreifen in der steht wo etwas geändert wurde.

Da bei mir zu etwas dazukommen kann (hängt mehr dahinter) muß ich mir was sinnvolles für die Überprüfung überlegen.

Danke erstmal für die schnelle Hilfe 😉