CLR-Trigger und Microsoft Message Queue
Allgemein SQL Server 2008 .Net
Wenn man einen Trigger schreiben möchte (Insert Trigger auf dem Microsoft SQL Server) um Einfüge-Operationen zu monitoren und in der MSMQ zu versenken, findet man im Internet ein paar Beispiele.
Ist auch schnell implementiert und läuft, man kann ja einfach ein Datatable serialisieren.
Sind es aber mal ein paar mehr inserts , kann man schon an die Grenze kommen 4 MB pro Message!
Kategorie Wenn man einen Trigger schreiben möchte (Insert Trigger auf dem Microsoft SQL Server) um Einfüge-Operationen zu monitoren und in der MSMQ zu versenken, findet man im Internet ein paar Beispiele.
Ist auch schnell implementiert und läuft, man kann ja einfach ein Datatable serialisieren.
Sind es aber mal ein paar mehr inserts , kann man schon an die Grenze kommen 4 MB pro Message!
Der folgende Code schafft (je nach Tabellengröße)
einen Workaround ->
public static void InsertTrigger()
{
SqlTriggerContext triggerContext = SqlContext.TriggerContext;
SqlCommand command = new SqlCommand();
SqlPipe pipe = SqlContext.Pipe;
Random random = new Random();
if (triggerContext.TriggerAction == TriggerAction.Insert)
{
command.Connection = new SqlConnection("context connection=true");
command.Connection.Open();
command.CommandText = "SELECT * FROM INSERTED";
var sda = new SqlDataAdapter(command);
var ds = new DataSet("DATASET");
sda.Fill(ds);
MessageQueue mq = new MessageQueue(".\\PRIVATE$\\sqlmsmq");
DataTable dt = new DataTable();
foreach (DataRow row in ds.Tables[0].Rows)
{
if (dt.Rows.Count % 100 == 0) {
if (dt.Rows.Count > 0) {
sendMessage(mq,dt);
}
dt = ds.Tables[0].Clone();
}
dt.ImportRow(row);
}
if (dt.Rows.Count > 0)
{
sendMessage(mq, dt);
}
command.Connection.Close();
}
}
Einfach die Datensätze spalten und als einzelne Messages senden
Gruß JJR
public static void InsertTrigger()
{
SqlTriggerContext triggerContext = SqlContext.TriggerContext;
SqlCommand command = new SqlCommand();
SqlPipe pipe = SqlContext.Pipe;
Random random = new Random();
if (triggerContext.TriggerAction == TriggerAction.Insert)
{
command.Connection = new SqlConnection("context connection=true");
command.Connection.Open();
command.CommandText = "SELECT * FROM INSERTED";
var sda = new SqlDataAdapter(command);
var ds = new DataSet("DATASET");
sda.Fill(ds);
MessageQueue mq = new MessageQueue(".\\PRIVATE$\\sqlmsmq");
DataTable dt = new DataTable();
foreach (DataRow row in ds.Tables[0].Rows)
{
if (dt.Rows.Count % 100 == 0) {
if (dt.Rows.Count > 0) {
sendMessage(mq,dt);
}
dt = ds.Tables[0].Clone();
}
dt.ImportRow(row);
}
if (dt.Rows.Count > 0)
{
sendMessage(mq, dt);
}
command.Connection.Close();
}
}
Einfach die Datensätze spalten und als einzelne Messages senden
Gruß JJR