Vaše otázka zůstává nejasná. Sledování pouze jednoho typu změny – „nová data“ (INSERT) podle nadpisu – je složitější než zjišťování jakékoli změny (podle I want to detect the Changes in my table
v komentářích, což je jednodušší).
MySql
poskytuje prostředky k získání kontrolního součtu tabulky:
checksum table TABLE_NAME [QUICK | EXTENDED]
Výsledky MySQL Workbench pro tabulku InnoDB a MyISAM:
Sledováním změn v těchto návratových hodnotách můžete zjistit jakoukoli změnu. Ale pozor:
- Tabulka musí být vytvořena s
Checksum = 1
možnost QUICK
volba nefunguje na tabulkách InnoDB před verzí 5.7.2 (IIRC a aktuální verze komunity je 5.7.14).
Naštěstí, pokud neurčíte možnost, zdá se, že MySQL vybere tu nejrychlejší, která vrátí hodnotu. Takže je snadné sledovat změny podle tabulky na časovači:
' 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)
Inicializovat:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Událost 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
Metoda My do something nám prostě nahlásí změny do seznamu:
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
Chcete-li skutečně sledovat něco jako pouze INSERTS, musíte použít nějakou tabulku protokolu. Přidejte spouštěč, který aktualizuje tuto tabulku časovým razítkem a možná kódem akce ("vložit", "smazat"). Pak stačí zkontrolovat změny TimeStamp, možná odfiltrovat akce, které nejsou sledovány.
Zejména verze pro sledování více tabulek nebo určitých změnových událostí bude jako třída fungovat lépe. Kód časovače může být zapouzdřen a může vyvolat události pro změny tabulky.
- MySQL v. 5.6 13.7.2.3 Syntaxe tabulky KONTROLNÍHO SOUČTU