आपका प्रश्न अस्पष्ट रहता है। केवल एक प्रकार के परिवर्तन की निगरानी करना - शीर्षक के अनुसार "नया डेटा" (INSERT) - किसी भी परिवर्तन का पता लगाने की तुलना में अधिक जटिल है (I want to detect the Changes in my table
टिप्पणियों में जो सरल है)।
MySql
तालिका का चेकसम प्राप्त करने के साधन प्रदान करता है:
checksum table TABLE_NAME [QUICK | EXTENDED]
एक InnoDB और MyISAM तालिका के लिए MySQL कार्यक्षेत्र परिणाम:
उन रिटर्न वैल्यू में बदलाव देखकर, आप किसी भी बदलाव का पता लगा सकते हैं। लेकिन ध्यान दें:
- तालिका
Checksum = 1
. के साथ बनाई गई होगी विकल्प QUICK
विकल्प 5.7.2 संस्करण से पहले InnoDB तालिकाओं पर काम नहीं करता है (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"))
टाइमर टिक इवेंट:
' 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 जैसी किसी चीज़ को देखने के लिए, आपको किसी प्रकार की लॉग तालिका का उपयोग करना होगा। एक ट्रिगर जोड़ें जो उस तालिका को टाइमस्टैम्प और शायद एक्शन कोड ("सम्मिलित करें", "हटाएं") के साथ अपडेट करता है। फिर परिवर्तनों के लिए टाइमस्टैम्प की जाँच करें, शायद गैर-घड़ी क्रियाओं को फ़िल्टर करना।
विशेष रूप से कई तालिकाओं या कुछ परिवर्तन घटनाओं को देखने के लिए एक संस्करण एक वर्ग के रूप में बेहतर काम करेगा। टाइमर कोड को इनकैप्सुलेट किया जा सकता है और यह तालिका में बदलाव के लिए ईवेंट बढ़ा सकता है।
- MySQL v. 5.6 13.7.2.3 चेकसम टेबल सिंटैक्स