Pertanyaan Anda masih belum jelas. Memantau hanya satu jenis perubahan - "data baru" (INSERT) sesuai judul - lebih rumit daripada mendeteksi perubahan apa pun (sesuai I want to detect the Changes in my table
dalam komentar yang lebih sederhana).
MySql
menyediakan sarana untuk mendapatkan checksum dari sebuah tabel:
checksum table TABLE_NAME [QUICK | EXTENDED]
Hasil MySQL Workbench untuk tabel InnoDB dan MyISAM:
Dengan memperhatikan perubahan pada nilai yang dikembalikan tersebut, Anda dapat mendeteksi perubahan apa pun. Tapi perhatikan:
- Tabel harus dibuat dengan
Checksum = 1
pilihan QUICK
opsi tidak berfungsi pada tabel InnoDB sebelum versi 5.7.2 (IIRC dan versi Komunitas saat ini adalah 5.7.14).
Untungnya, jika Anda tidak menentukan opsi, MySQL tampaknya memilih yang tercepat yang akan mengembalikan nilai. Jadi, menjadi mudah untuk melacak perubahan berdasarkan tabel pada 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)
Inisialisasi:
Timer1.Enabled = True
Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))
Acara 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
Metode saya melakukan sesuatu, kami hanya melaporkan perubahan ke kotak daftar:
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
Untuk benar-benar menonton sesuatu seperti hanya INSERTS, Anda harus menggunakan semacam tabel log. Tambahkan pemicu yang memperbarui tabel itu dengan TimeStamp dan mungkin kode tindakan ("masukkan", "hapus"). Kemudian cukup periksa TimeStamp untuk melihat perubahan, mungkin menyaring tindakan non-tonton.
Khususnya versi untuk menonton banyak tabel atau peristiwa perubahan tertentu akan berfungsi lebih baik sebagai kelas. Kode pengatur waktu dapat dienkapsulasi dan dapat memunculkan peristiwa untuk perubahan tabel.
- MySQL v. 5.6 13.7.2.3 Sintaks TABEL CHECKSUM