Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Überwachen Sie neue Daten in der MySQL-Tabelle

Ihre Frage bleibt unklar. Die Überwachung nur einer Art von Änderung – „neue Daten“ (INSERT) wie im Titel angegeben – ist komplizierter als die Erkennung jeder Änderung (gemäß I want to detect the Changes in my table in Kommentaren, was einfacher ist).

MySql bietet die Möglichkeit, die Prüfsumme einer Tabelle zu erhalten:

checksum table TABLE_NAME [QUICK | EXTENDED]

MySQL Workbench-Ergebnisse für eine InnoDB- und MyISAM-Tabelle:

Indem Sie auf Änderungen in diesen Rückgabewerten achten, können Sie jede Änderung erkennen. Aber beachten Sie:

  • Die Tabelle muss mit dem Checksum = 1 erstellt worden sein Möglichkeit
  • Der QUICK Option funktioniert nicht mit InnoDB-Tabellen vor Version 5.7.2 (IIRC und die aktuelle Community-Version ist 5.7.14).

Glücklicherweise scheint MySQL, wenn Sie keine Option angeben, die schnellste auszuwählen, die einen Wert zurückgibt. So wird es einfach, Änderungen pro Tabelle auf einem Timer zu verfolgen:

' Track last checksum by table
Friend Class TableItem
    Public Property Name As String
    Public Property CheckSum As Int64

    Public Sub New(n As String)
        Name = n
        CheckSum = 0
    End Sub
End Class
' a list of them to track more than one table:
Private Tables As List(Of TableItem)

Initialisieren:

Timer1.Enabled = True

Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))

Das Timer-Tick-Ereignis:

' Note: cannot use Parameters for table or col names
Dim sql = "CHECKSUM TABLE {0} "

Using dbcon As New MySqlConnection(mySQLConnStr)
    dbcon.Open()
    Using cmd As New MySqlCommand(sql, dbcon)
        ' loop thru collection, polling one at a time
        For Each tbl As TableItem In Tables
            cmd.CommandText = String.Format(sql, tbl.Name)

            Using rdr As MySqlDataReader = cmd.ExecuteReader()
                If rdr.Read Then
                    Dim thisResult = rdr.GetInt64(1)

                    ' ignore the first result
                    If tbl.CheckSum = 0 Then
                        tbl.CheckSum = thisResult
                        Return
                    End If
                    ' save the last non-zed value
                    If tbl.CheckSum <> thisResult Then
                        tbl.CheckSum = thisResult
                        ' method to do something when changed:
                        TableChanged(tbl.Name)
                    End If

                End If
            End Using
        Next
    End Using
End Using

Meine Do-Something-Methode lässt uns einfach die Änderungen an ein Listenfeld melden:

Private Sub TableChanged(tbl As String)
    lb.Items.Add(String.Format("Table {0} changed {1}", tbl,
                               DateTime.Now.ToString("HH:mm:ss.ffffff")))
End Sub

Um tatsächlich nur auf INSERTS zu achten, müssten Sie eine Art Protokolltabelle verwenden. Fügen Sie einen Trigger hinzu, der diese Tabelle mit einem TimeStamp und möglicherweise einem Aktionscode ("insert", "delete") aktualisiert. Überprüfen Sie dann einfach den TimeStamp auf Änderungen und filtern Sie möglicherweise Aktionen heraus, die nicht beobachtet werden.

Besonders eine Version, um mehrere Tische oder bestimmte Änderungsereignisse zu beobachten, wird als Klasse besser funktionieren. Der Timer-Code kann eingekapselt werden und könnte Ereignisse für Tabellenänderungen auslösen.