Die Datenbankansicht spiegelt nicht die Daten in der untergeordneten Tabelle wider

7

Eingabe:

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:

Ist es möglich, dass eine VIEW Daten anzeigt, die nicht mit der zugrundeliegenden TABLE (s) übereinstimmen?

  • Was sind mögliche Ursachen / Gründe dafür?
  • Kann eine UPDATE-Anweisung in einer Ansicht bewirken, dass zukünftige SELECTs "aktualisierte" Daten zurückgeben, wenn die Tabelle dies nicht wirklich tut?

Mögliche Ursachen (bitte kommentieren Sie diese mit Fragezeichen):

  1. Der Grund ist, dass es zwei getrennte Transaktionen gibt, die die Verwirrung der Kunden erklären würden.
  2. Die zugrunde liegende Tabelle wurde geändert, aber die Ansicht wurde nicht aktualisiert (mit sp_refreshview)
  3. ein anderer Benutzer verbindet sich und kann aufgrund von Berechtigungen verschiedene Daten sehen?
  4. Programmierfehler: falsche Tabellen / Spalten, falsche Filter (all-in-one hier)
  5. Korruption tritt auf: DBCC CHECKDB sollte helfen
  6. kann SELECT ... FOR UPDATE verursachen ???
  7. ? __

Was wirklich passiert ist (DIE ANTWORT):

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.

    
van 18.06.2009, 16:26
quelle

6 Antworten

19

Ja, irgendwie.

Mögliche Ursachen:

  1. 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.

  2. The View betrachtet etwas anderes als das, was Sie / Sie denken. Sie schauen auf den falschen Tisch oder die falsche Ansicht.

  3. Die Ansicht transformiert die Daten auf unerwartete Weise. Es funktioniert richtig, nur nicht wie sie erwartet haben.

  4. Die Ansicht gibt eine andere Teilmenge der Daten als erwartet zurück. Wieder funktioniert es richtig, nur nicht wie sie denken.

  5. Sie sehen sich die falsche Datenbank oder eine Anmeldungs- / Benutzeridentität an, die bewirkt, dass die Ansicht ändert, was sie anzeigt.

RBarryYoung 18.06.2009, 16:34
quelle
10

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

    
SQLMenace 18.06.2009 16:30
quelle
3

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.

    
HLGEM 18.06.2009 17:36
quelle
2

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%     
Tom H 18.06.2009 16:35
quelle
1

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.

    
Remus Rusanu 18.06.2009 16:43
quelle
0

Sicher gibt es andere Dinge:

%Vor%

um ein paar zu nennen

    
northpole 18.06.2009 16:31
quelle

Tags und Links