2009-05-19 2 views
1

Update: Mein Problem scheint nicht mit dem SQL-Server zu sein. Ich habe eine Update-Anweisung innerhalb der Datenbank manuell gegen die Ansicht ausgeführt und konnte die Bar-Tabelle aktualisieren. Ich schließe das und recherchiere die OleDbDataAdapters mehr, da ich denke, dass das Problem bei ihnen liegt.Wie kann man feststellen, welche Tabelle einer Multitable-View aktualisierbar ist?

Diese Frage gilt für MS SQL Server 2000. Wie kann ich feststellen, welche Tabelle der Multitabelle kann geändert werden?

Ich habe die folgende Ansicht:

CREATE VIEW dbo.MyView 
AS 
SELECT  dbo.Foo.Id, dbo.Bar.Id, dbo.Foo.column1, dbo.Foo.column2, 
      dbo.Foo.column3, dbo.Bar.column1, dbo.Bar.column2, 
      dbo.Bar.column3 
FROM  dbo.Bar INNER JOIN 
        dbo.Foo ON dbo.Bar.Id = dbo.Foo.ForeignId 

Wenn ich diese Ansicht aktualisieren (mit VB.NET OleDbDataAdapters), I Spalten von Foo aktualisieren kann, aber nicht Spalten von Bar. Meine Untersuchung dazu sagt mir, dass in einer solchen Multi-View-Ansicht der MS SQL-Server nur erlaubt, eine der Tabellen zu aktualisieren. Meine Frage ist also, wie SQL Server ermittelt, welche Tabelle aktualisiert werden kann?

Ich habe einen Test versucht, wo ich die Felder einer bestimmten Zeile aus der Ansicht bearbeiten. Danach habe ich den OleDbDataAdapter verwendet, um die Ansicht zu aktualisieren. Nur die Änderungen am Foo-Tisch wurden akzeptiert. Die Änderungen an der Bar-Tabelle wurden ignoriert (keine Ausnahme ausgelöst).

Gibt es eine Möglichkeit vorherzusagen, welche der Tabellen aktualisiert werden kann oder welche Kontrolle über welche? Was, wenn ich wollte, dass Bar die aktualisierbare Tabelle statt Foo ist?

Update: Ich fand dies auf Google, MS SQL Server 2000 Unleased:

http://books.google.com/books?id=G2YqBS9CQ0AC&pg=RA1-PA713&lpg=RA1-PA713&dq=ms+sql+server+ "Multitable + view" ++ aktualisiert & source = bl & OTS = ZuQXIlEPbO & sig = JbgdDe5yU73aSkxh-SLDdtMYZDs & hl = en & ei = b-0SSq-aHZOitgPB38zgDQ & sa = X & oi = book_result & ct = Ergebnis & resnum = 1 # PRA1-PA713, M1

(Für die URL irgendeinem Grund einfügen ich versuche, mit nicht funktioniert diese Seite, sorr y, die Sie & Paste kopieren)

die sagt:.

  • Ein Update über eine Multitable Ansicht nicht mehr als ein zugrundeliegende Basistabelle auswirken.
  • Ein Löschvorgang kann nicht für Mehrfachansichten ausgeführt werden.

Aber ich sehe noch keine Antwort auf meine Frage.

Auch hier ist meine Frage:

Wie bestimme ich, welche Tabelle der Multitable-Ansicht geändert werden kann?

Ich weiß, ich kann zwei Update-Anweisungen für jede Tabelle schreiben. Meine Sorge ist anders. Ich muss Code überprüfen, der Ansichten wie die obige verwendet, und aktualisiert die Ansichten.Ich hoffte, einen Weg zu finden, um festzustellen, welche Teile der Updates stillschweigend ignoriert werden.

Beispiel:

I Bar.Column1 bearbeiten und dann das Update() -Methode des OleDbDataAdapter nennen. Dies führt dazu, dass die Bar-Tabelle nicht geändert wird oder eine Ausnahme ausgelöst wird. Wenn ich Foo.Column2 editiere und dann Update() anrufe, wird die Foo-Tabelle modifiziert.

+0

Wenn Sie versuchen, Bar zu aktualisieren, aktualisieren Sie gleichzeitig Foo? – JeffO

+0

Da ich den OleDbDataAdapter verwende, bin ich mir nicht sicher über die genaue SQL-Syntax, die der Datenbank zugeführt wird. Der Datenadapter zieht Daten direkt aus der Ansicht, so dass ich angenommen habe, dass er die Ansicht und nicht die einzelnen Tabellen aktualisiert. Weißt du, wie ich das überprüfen kann? –

+0

Ich sollte hinzufügen, dass ich verstehe, dass das Aktualisieren der Ansicht bewirkt, dass die Basistabellen aktualisiert werden. Ich weiß, dass die Ansicht selbst keine Daten enthält. Tut mir leid, wenn das in dem, was ich geschrieben habe, verwirrend war! –

Antwort

-1

Sie müssen die Zeile in der Tabelle eindeutig identifizieren können, indem Sie den Primärschlüssel zurückgeben. Versuchen Sie, dbo.Bar.Id in der Ansicht zurückzugeben, und Sie sollten Spalten in Tabelle Bar bearbeiten können.

+0

In meiner tatsächlichen Ansicht schließe ich Bar.Id in die Auswahl ein. Ich werde die Frage entsprechend aktualisieren. Irgendwelche anderen Ideen? –

1

Sie können jede Tabelle in der Ansicht aktualisieren, aber nur Felder, die sich alle in derselben Tabelle in dieser Anweisung befinden. Wenn Sie Felder aus zwei Tabellen in einer Sicht aktualisieren müssen, müssen Sie zwei Aktualisierungsanweisungen schreiben.

Persönlich bevorzuge ich nicht zu aktualisieren oder aus Ansichten überhaupt zu löschen. Ich benutze dafür die Basistabellen.

Es gibt auch Regeln, ob die Ansicht aktualisierbar ist. Siehe Bücher online. Suche nach diesem: Views-SQL Server, Ändern von Daten

+0

Wenn ich Sie verstehe, sagen Sie mir, dass ich jede Basistabelle aktualisieren soll, anstatt die Ansicht zu aktualisieren. Soweit ich das beurteilen kann, widerspricht das dem Zweck der Ansicht, zB muss der Client-Code die Struktur der Basistabellen kennen. –

+0

Und mehr auf den Punkt. Mir ist klar, dass ich die Tabellen unabhängig von der Ansicht aktualisieren kann. Stattdessen wollte ich herausfinden, wie MS SQL Server bestimmt, welche der beiden Tabellen ich aktualisieren kann. Das Verhalten, das ich sehe, ist, dass Änderungen an Bar ignoriert werden, aber Änderungen an Foo gespeichert werden. –

+0

Wenn Sie nur ein Feld in Bar ändern und keine Felder in Foo speichern würden? SQL Server wählt nicht nur eine Tabelle aus, die aktualisiert wird. Das Update kann nur eine Tabelle enthalten, auch wenn Sie die Ansicht aktualisieren. Ja, der Client-Code muss die Struktur der Basistabellen in jedem Fall kennen, da Sie Felder aus zwei Tabellen niemals gleichzeitig aktualisieren können. – HLGEM

Verwandte Themen