Ελέγξτε για τις αλλαγές σε πίνακα του SQL Server;

ψήφοι
122

Πώς μπορώ να παρακολουθήσει μια βάση δεδομένων του SQL Server για τις αλλαγές σε ένα τραπέζι χωρίς τη χρήση ωθήσεις ή τροποποίηση της δομής της βάσης δεδομένων με κάθε τρόπο; Προτιμάται προγραμματιστικό περιβάλλον μου είναι .NET και C #.

Θα ήθελα να είναι σε θέση να υποστηρίξει οποιοδήποτε SQL Server 2000 SP4 ή νεότερη έκδοση. Η εφαρμογή μου είναι μια οπτικοποίηση δεδομένων bolt-on για το προϊόν άλλης εταιρείας. Πελατειακή βάση μας είναι σε χιλιάδες, οπότε δεν θέλω να πρέπει να θέσει σε απαιτήσεις που τροποποιούν τον πίνακα του πωλητή τρίτου μέρους σε κάθε εγκατάσταση.

Με το «αλλαγές σε έναν πίνακα» Θέλω να πω αλλαγές στον πίνακα δεδομένων, δεν αλλάζει στο τραπέζι δομή.

Τελικά, θα ήθελα την αλλαγή για να προκαλέσει μια εκδήλωση στην αίτησή μου, αντί να πρέπει να ελέγξετε για τις αλλαγές σε ένα διάστημα.


Η καλύτερη πορεία δράσης δεδομένες απαιτήσεις μου (δεν ενεργοποιεί ή τροποποίηση σχήμα, SQL Server 2000 και το 2005) φαίνεται να είναι να χρησιμοποιήσετε τη BINARY_CHECKSUMλειτουργία T-SQL . Ο τρόπος που σχεδιάζουν να εφαρμόσουν είναι το εξής:

Κάθε Χ δευτερόλεπτα εκτελέστε το ακόλουθο ερώτημα:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

Και συγκρίνουν ότι κατά την αποθηκευμένη τιμή. Εάν έχει αλλάξει η τιμή, περνούν από τον πίνακα γραμμή προς γραμμή χρησιμοποιώντας το ερώτημα:

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

Και συγκρίνουν τις επέστρεψε αθροίσματα ελέγχου κατά αποθηκευμένες τιμές.

Δημοσιεύθηκε 01/08/2008 στις 13:35
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
90

Ρίξτε μια ματιά στην εντολή ελέγχου:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

Αυτό θα επιστρέψει τον ίδιο αριθμό κάθε φορά που τρέχει για όσο διάστημα τα περιεχόμενα πίνακα δεν έχουν αλλάξει. Δείτε τη θέση μου σε αυτό για περισσότερες πληροφορίες:

CHECKSUM

Εδώ είναι το πώς θα χρησιμοποιήσει για την ανοικοδόμηση των εξαρτήσεων μνήμη cache, όταν άλλαξε πίνακες:
εξάρτηση ASP.NET 1.1 βάσης δεδομένων της κρυφής μνήμης (χωρίς ωθήσεις)

Απαντήθηκε 02/08/2008 στις 06:20
πηγή χρήστη

ψήφοι
30

Δυστυχώς CHECKSUM δεν λειτουργεί πάντα σωστά για τον εντοπισμό αλλαγών . Είναι μόνο μια πρωτόγονη άθροισμα ελέγχου και δεν υπολογισμό CRC. Ως εκ τούτου δεν μπορείτε να το χρησιμοποιήσετε για να ανιχνεύσει όλες τις αλλαγές, π.χ. συμμετρική αλλαγές ως αποτέλεσμα την ίδια CHECKSUM!

Π.χ. η λύση με CHECKSUM_AGG(BINARY_CHECKSUM(*))παραδίδει πάντα 0 για όλες τις 3 πίνακες με διαφορετικό περιεχόμενο!


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!

Απαντήθηκε 30/03/2011 στις 13:07
πηγή χρήστη

ψήφοι
25

Γιατί δεν θέλετε να χρησιμοποιήσετε ερεθίσματα; Είναι ένα καλό πράγμα, αν τα χρησιμοποιείτε σωστά. Εάν τα χρησιμοποιούν ως ένας τρόπος για να επιβάλουν την ακεραιότητα αναφορών δηλαδή όταν πάνε από το καλό στο κακό. Αλλά αν τα χρησιμοποιήσετε για την παρακολούθηση, που δεν είναι πραγματικά θεωρούνται ταμπού.

Απαντήθηκε 01/08/2008 στις 14:07
πηγή χρήστη

ψήφοι
19

Πόσο συχνά πρέπει να ελέγξετε για αλλαγές και πόσο μεγάλη (από άποψη μεγέθους σειρά) είναι οι πίνακες στη βάση δεδομένων; Εάν χρησιμοποιείτε τη CHECKSUM_AGG(BINARY_CHECKSUM(*))μέθοδο που προτείνεται από τον Ιωάννη, θα σαρώσει κάθε γραμμή του συγκεκριμένου πίνακα. Η NOLOCKυπόδειξη βοηθά, αλλά σε μια μεγάλη βάση δεδομένων, που εξακολουθεί να πλήττει κάθε σειρά. Θα πρέπει επίσης να αποθηκεύσετε το άθροισμα ελέγχου για κάθε γραμμή, έτσι ώστε να πει κάποιος έχει αλλάξει.

Έχετε σκεφτεί πηγαίνει σε αυτό από μια διαφορετική οπτική γωνία; Εάν δεν θέλετε να τροποποιήσετε το σχήμα για να προσθέσετε ωθήσεις, (η οποία κάνει αίσθηση, δεν είναι βάση δεδομένων σας), έχετε σκεφτεί την εργασία με τον πωλητή εφαρμογή που κάνει τη βάση δεδομένων;

Θα μπορούσαν να εφαρμόσουν ένα API που παρέχει ένα μηχανισμό για την κοινοποίηση εφαρμογές αξεσουάρ που τα δεδομένα έχουν αλλάξει. Θα μπορούσε να είναι τόσο απλό όσο γραπτώς σε έναν πίνακα ειδοποίηση που αναφέρει ποιες τραπέζι και η οποία σειρά τροποποιήθηκαν. Αυτό θα μπορούσε να υλοποιηθεί μέσω της ενεργοποίησης ή κώδικα της εφαρμογής. Από την πλευρά σας, ti δεν θα είχε σημασία, μόνο ανησυχία σας θα σάρωση του πίνακα κοινοποίηση σε περιοδική βάση. Η απόδοση χτύπησε στη βάση δεδομένων θα είναι πολύ λιγότερο από ό, τι σάρωση κάθε σειρά για αλλαγές.

Το δύσκολο μέρος θα είναι να πείσει τον προμηθευτή της εφαρμογής για την υλοποίηση αυτής της δυνατότητας. Δεδομένου ότι αυτό μπορεί να είναι λαβές εξ ολοκλήρου μέσω SQL μέσω ωθήσεις, θα μπορούσατε να κάνετε το μεγαλύτερο μέρος του έργου τους με το γράψιμο και τη δοκιμή των ενεργοποιεί και στη συνέχεια να φέρει τον κωδικό στο προμηθευτή της εφαρμογής. Έχοντας την υποστήριξη του πωλητή τις ωθήσεις, να αποφευχθεί η κατάσταση κατά την οποία η προσθήκη σας μια σκανδάλη κατά λάθος αντικαθιστά μια σκανδάλη που παρέχονται από τον προμηθευτή.

Απαντήθηκε 03/08/2008 στις 14:59
πηγή χρήστη

ψήφοι
18

Έχετε μια δουλειά DTS (ή μια δουλειά που ξεκίνησε από μια υπηρεσία παράθυρα) που τρέχει σε ένα δεδομένο χρονικό διάστημα. Κάθε φορά που τρέχει, παίρνει πληροφορίες σχετικά με το δεδομένο πίνακα χρησιμοποιώντας το σύστημα information_schema πίνακες, και καταγράφει τα δεδομένα στο χώρο αποθήκευσης δεδομένων. Συγκρίνετε τα δεδομένα που επιστρέφονται σχετικά με τη δομή του πίνακα με τα δεδομένα που επέστρεψε την προηγούμενη φορά. Αν είναι διαφορετικό, τότε ξέρεις ότι η δομή έχει αλλάξει.

Παράδειγμα ερώτημα για να επιστρέψει πληροφορίες σχετικά με όλες τις στήλες του πίνακα ABC (ιδανικά λίστα έξω ακριβώς τις στήλες από τον πίνακα information_schema που θέλετε, αντί να χρησιμοποιούν * επιλέξτε ** όπως κάνω εδώ):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

Θα παρακολουθεί διαφορετικές στήλες και τις απόψεις information_schema ανάλογα με το πώς ακριβώς θα οριστεί η «αλλαγές σε έναν πίνακα».

Απαντήθηκε 01/08/2008 στις 15:06
πηγή χρήστη

ψήφοι
17

Δυστυχώς, δεν νομίζω ότι υπάρχει ένα καθαρό τρόπο για να το κάνετε αυτό σε SQL2000. Αν περιορίσετε τις απαιτήσεις σας με τον SQL Server 2005 (και αργότερα), τότε είστε στην επιχείρηση. Μπορείτε να χρησιμοποιήσετε την SQLDependencyτάξη System.Data.SqlClient. Δείτε Ερώτημα Ειδοποιήσεις σε SQL Server (ADO.NET) .

Απαντήθηκε 06/08/2008 στις 02:54
πηγή χρήστη

ψήφοι
13

Άγρια εικασία εδώ: Αν δεν θέλετε να τροποποιήσετε πίνακες του τρίτου μέρους, Μπορείτε να δημιουργήσετε μια προβολή και, στη συνέχεια, βάλτε ένα έναυσμα για αυτή την άποψη;

Απαντήθηκε 05/08/2008 στις 02:12
πηγή χρήστη

ψήφοι
7

Ελέγξτε την τελευταία ημερομηνία διαπράξει. Κάθε βάση δεδομένων έχει μια ιστορία, όταν διαπράττουν γίνεται η κάθε μία. Πιστεύω ότι του ένα πρότυπο συμμόρφωσης ΟΞΥ.

Απαντήθηκε 24/07/2014 στις 05:58
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more