Din fråga är fortfarande otydlig. Att övervaka endast en typ av förändring - "ny data" (INSERT) enligt rubriken - är mer komplicerat än att upptäcka någon förändring (enligt Jag vill upptäcka ändringarna i min tabell
i kommentarer vilket är enklare).
MySql
ger möjlighet att få kontrollsumman för en tabell:
checksum table TABLE_NAME [QUICK | EXTENDED]
MySQL Workbench-resultat för en InnoDB- och MyISAM-tabell:
Genom att se efter ändringar i dessa returvärden kan du upptäcka alla ändringar. Men notera:
- Tabellen måste ha skapats med
Checksum =1
alternativ SNABB alternativet fungerar inte på InnoDB-tabeller före version 5.7.2 (IIRC och den nuvarande communityversionen är 5.7.14).
Lyckligtvis, om du inte anger ett alternativ, verkar MySQL välja det snabbaste som kommer att returnera ett värde. Så det blir lätt att spåra ändringar efter tabell på en timer:
' 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)
Initiera:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Timer Tick-händelsen:
' 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
Jag gör något sätt att vi bara rapporterar ändringarna till en listbox:
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
För att faktiskt titta efter något som bara INSLAG, måste du använda någon sorts loggtabell. Lägg till en trigger som uppdaterar den tabellen med en tidsstämpel och kanske åtgärdskod ("infoga", "radera"). Sedan är det bara att kontrollera tidsstämpeln för ändringar, kanske filtrera bort icke-bevakade åtgärder.
Speciellt en version för att titta på flera bord eller vissa förändringshändelser kommer att fungera bättre som klass. Timerkoden kan kapslas in och det kan leda till händelser för en tabelländring.
- MySQL v. 5.6 13.7.2.3 KONTROLLSUMMATABELL Syntax