Въпросът ви остава неясен. Наблюдението на само един тип промяна - "нови данни" (INSERT) според заглавието - е по-сложно от откриването на всяка промяна (съгласно I want to detect the Changes in my table
в коментарите, което е по-просто).
MySql
предоставя средствата за получаване на контролната сума на таблица:
checksum table TABLE_NAME [QUICK | EXTENDED]
Резултати от MySQL Workbench за таблица InnoDB и MyISAM:
Като наблюдавате промените в тези върнати стойности, можете да откриете всяка промяна. Но имайте предвид:
- Таблицата трябва да е създадена с
Checksum = 1
опция QUICK
опцията не работи на InnoDB таблици преди версия 5.7.2 (IIRC и текущата версия на Общността е 5.7.14).
За щастие, ако не посочите опция, MySQL изглежда избира най-бързата, която ще върне стойност. Така става лесно да се проследяват промените по таблица на таймер:
' 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)
Инициализирайте:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Събитието Timer Timer:
' 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
Моят метод „Направи нещо“, като просто отчитаме промените в списъчно поле:
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
За да наблюдавате действително нещо като само INSERTS, ще трябва да използвате някакъв вид регистрационна таблица. Добавете тригер, който актуализира тази таблица с TimeStamp и може би код за действие („вмъкване“, „изтриване“). След това просто проверете TimeStamp за промени, може би филтриране на действия, които не са за гледане.
По-специално версия за гледане на множество таблици или определени събития за промяна ще работи по-добре като клас. Кодът на таймера може да бъде капсулиран и може да предизвика събития за промени в таблицата.
- MySQL v. 5.6 13.7.2.3 ТАБЛИЦА КОНТРОЛНА СУМА Синтаксис