Der Kunde behauptet, dass die Anwendung (.NET) bei der Abfrage einiger Daten andere Daten zurückgibt, als wenn der Kunde direkt in die Datentabelle schaut.
Ich verstehe, dass es verschiedene Gründe und an ganz verschiedenen Orten geben könnte. Mein Ziel ist es hier nicht zu lösen, sondern erfahrene DBAs und DB Entwickler zu fragen, wenn:
SELECT ... FOR UPDATE
verursachen ???
Die Spaltenpositionen wurden in einigen Tabellen geändert: Anscheinend gab der Kunde einem Datenbankberater einen vollständigen Datenbankzugriff für die Analyse der Datenbanknutzung. Dieser tolle Typ hat die Reihenfolge der Spalten geändert, um die wenigen audit Felder am Anfang der Tabelle zu sehen, wenn SELECT * ...
-Klauseln verwendet werden.
Unter Verwendung von dbGhost wurde das Datenbankschema mit dem Schema der Sicherung verglichen, das einige Tage vor dem Problem erstellt wurde erschien, und die Spaltenposition Unterschiede wurden entdeckt.
Was als nächstes kam, war nichts mit Programmierung zu tun, sondern eher mit Politik.
Daher war die sp_refreshview
die Lösung. Ich habe nur einen Schritt mehr unternommen, um herauszufinden, wer das Problem verursacht hat. Danke euch allen.
Ja, irgendwie.
Mögliche Ursachen:
Die Ansicht muss aktualisiert oder neu kompiliert werden. Das passiert, wenn Quellspaltedefinitionen sich ändern und die Ansicht (oder etwas, von dem sie abhängt) "*" verwendet, kann unangenehm sein. Rufen Sie sp_RefreshView auf. Dies kann auch aufgrund von Sichten oder Funktionen (Datenquellen) geschehen, die ebenfalls aufgerufen werden.
The View betrachtet etwas anderes als das, was Sie / Sie denken. Sie schauen auf den falschen Tisch oder die falsche Ansicht.
Die Ansicht transformiert die Daten auf unerwartete Weise. Es funktioniert richtig, nur nicht wie sie erwartet haben.
Die Ansicht gibt eine andere Teilmenge der Daten als erwartet zurück. Wieder funktioniert es richtig, nur nicht wie sie denken.
Sie sehen sich die falsche Datenbank oder eine Anmeldungs- / Benutzeridentität an, die bewirkt, dass die Ansicht ändert, was sie anzeigt.
Es ist möglich, dass die zugrunde liegende Tabelle geändert wurde und sp_refreshview nicht für die Ansicht ausgeführt wurde. Daher enthält die Ansicht fehlende Spalten, wenn diese zur Tabelle hinzugefügt wurden.
Um zu sehen, was ich meine, lesen Sie wie Sie sicherstellen können, dass sich die zugrunde liegende Tabelle in der Ansicht ändert, indem Sie sp_refreshview verwenden
Sie können Ansichten mit Sperrungshinweisen erstellen, was bedeutet, dass Sie möglicherweise einen schmutzigen Lesezugriff erhalten. Oder alternativ, wenn sie direkt auf die Tabelle zugreifen, könnten sie Locking-Hinweise verwenden, die ihnen zu diesem Zeitpunkt einen Dirty-Read geben könnten.
Eine andere Möglichkeit, die Benutzer nicht zu verstehen scheinen, ist, dass die Daten flüssig sind. Die Daten, die Sie um 3:00 Uhr in einer Ansicht lesen, sind möglicherweise nicht dieselben Daten, die Sie um 3:30 Uhr sehen, wenn Sie direkt auf den Tisch schauen, da sich in der Zwischenzeit Änderungen ergeben haben.
Einige Möglichkeiten:
Ihre .NET-Anwendung verweist möglicherweise nicht auf die Stelle, von der Sie oder sie denken, dass sie darauf hinweist. Zum Beispiel wird versehentlich auf einen Testserver verwiesen
Wenn die Ansicht einen Index für einen Gleitkomma- oder numerischen Wert enthält, kann sich der Wert aufgrund von Rundungen von der zugrunde liegenden Abfrage unterscheiden
Die Einstellung ANSI_NULLS ist spezifisch für die Ansicht, als sie erstellt wurde. Wenn es sich von der Einstellung während der Auswahl der zugrunde liegenden Tabellen unterscheidet, kann es bei bestimmten Arten von Abfragen zu Unstimmigkeiten kommen
Die zugrunde liegenden Tabellenstrukturen haben sich geändert und die Ansicht wurde nicht aktualisiert (insbesondere ein Problem, wenn sie "SELECT *" verwendet)
Ich werde diesen Beitrag bearbeiten, wenn ich an andere denke.
EDIT: Hier ist ein Beispiel, wie die ANSI_NULLS-Einstellung Ihre Ergebnisse abwerfen kann:
%Vor%Die Ergebnisse, die Sie erhalten sollten, sind:
%Vor%Unter der Annahme, dass die Ansicht die Daten nicht tatsächlich transformiert , ist es technisch möglich, dass eine Beschädigung auftritt. View ruft Daten von einem Index ab, 'table' ruft von einem anderen (dh von einem Cluster) ab und die beiden sind nicht synchron. Ein DBCC CHECKDB sollte das Problem aufdecken.
Aber menschlicher Fehler ist viel wahrscheinlicher, dh. Sie schauen auf andere Tabellen als die Ansicht oder auf verschiedene Datensätze.
Tags und Links sql sql-server schema