Twoje pytanie pozostaje niejasne. Monitorowanie tylko jednego rodzaju zmiany – „nowych danych” (WSTAW) zgodnie z tytułem – jest bardziej skomplikowane niż wykrywanie jakiejkolwiek zmiany (zgodnie z I want to detect the Changes in my table
w komentarzach, co jest prostsze).
MySql
zapewnia środki do uzyskania sumy kontrolnej tabeli:
checksum table TABLE_NAME [QUICK | EXTENDED]
Wyniki MySQL Workbench dla tabeli InnoDB i MyISAM:
Obserwując zmiany w tych zwracanych wartościach, możesz wykryć każdą zmianę. Ale uwaga:
- Tabela musi zostać utworzona z
Checksum = 1
opcja QUICK
opcja nie działa na tabelach InnoDB przed wersją 5.7.2 (IIRC, a obecna wersja Community to 5.7.14).
Na szczęście, jeśli nie określisz opcji, MySQL wydaje się wybierać najszybszą, która zwróci wartość. Dzięki temu śledzenie zmian według tabeli na zegarze staje się łatwe:
' 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)
Zainicjuj:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Wydarzenie Timer Tick:
' 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
Moja metoda zrób coś, po prostu zgłaszamy zmiany w polu listy:
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
Aby faktycznie szukać czegoś takiego jak tylko INSERTY, musiałbyś użyć jakiejś tabeli dziennika. Dodaj wyzwalacz, który aktualizuje tę tabelę za pomocą znacznika czasu i być może kodu akcji („wstaw”, „usuń”). Następnie po prostu sprawdź znacznik czasu pod kątem zmian, być może odfiltrowując działania, które nie są związane z oglądaniem.
Szczególnie wersja do oglądania wielu stołów lub niektórych wydarzeń związanych ze zmianą będzie działać lepiej jako klasa. Kod czasomierza może być hermetyzowany i może wywołać zdarzenia w przypadku zmian w tabeli.
- MySQL w wersji 5.6 13.7.2.3 TABELA SUMY KONTROLNEJ Składnia