Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Updatefähiges View
zurück: ODBC-Zugriff von Access auf SQL weiter: Datum und Zeit aus Datumsfeld isolieren Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Antwort Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
RoKz
Gast


Verfasst am:
23. Jul 2013, 11:41
Rufname:

Updatefähiges View - Updatefähiges View

Nach oben
       Version: Office 2007

RoKz am 23. Jul 2013 um 09:04 hat folgendes geschrieben:
Hallo zusammen

Ich arbeite an einer Datenbank mit Backend SQL Server 2008 R2 und Frontend Access 2007. Um bestimmte Daten darzustellen, habe ich auf dem Server ein View erstellt. Dieses beinhaltet Daten aus zwei Tabellen:
  • dbo.Part: PartId (PK), SerialNumber, Status
  • dbo.PartMacAddress: PartMacAddressId (PK), PartId (FK, unique), MacAddress
Der Grund der Auslagerung der 1:1-Beziehung ist, dass nicht jeder Part zwingend eine MAC-Adresse besitzen muss, also eine Untermenge.
Das View enthält alle Parts und zusätzlich die MAC-Adresse:
Code:
SELECT dbo.Part.PartId, dbo.Part.SerialNumber, dbo.Part.Status,
       dbo.PartMacAddress.MacAddress
FROM   dbo.Part
       LEFT OUTER JOIN dbo.PartMacAddress
       ON dbo.Part.PartId = dbo.PartMacAddress.PartId
Die Daten werden korrekt dargestellt und falls für einen Part keine MAC-Adresse exisitiert, steht NULL im Feld.
Wenn ich nun die MAC-Adresse editieren will (Edit Top 200 Rows), gibt mir das Management Studio einen Fehler falls der Wert noch nicht existiert (= NULL), d.h. ich dem Part eine MAC-Adresse hinzufügen will. Existiert bereits eine MAC-Adresse, so kann ich diese aber problemlos abändern!
Der Fehler lautet:

Zitat:
Data has changed since the Results pane was last retrieved. Do you want to save your changes now?
(Optimistic Concurrency Control Error)
Bestätige ich mit Ja, trotzdem speichern, erhalte ich:
Zitat:
No row was updated.
The data in row X was not committed.
Error Source: Microsoft.SqlServer,Management.DataTools.
Error Message: The updated row has changed or been deleted since data was last retrieved
Den gleichen Fehler (Schreibkonflikt, Datensatz seit Beginn der Bearbeitung von anderem Benutzer geändert) erhalte ich beim verknüpften View im Access. Deshalb gehe ich davon aus, dass das Problem beim SQL Server liegt.
Ausschliessen kann ich, dass ein anderer Benutzer Daten ändert. Es hat niemand sonst Zugriff. Bei Microsoft CREATE VIEW (Transact-SQL) sind Restriktionen für updatefähige Views aufgelistet, welche ich aber alle erfülle meiner Meinung nach.

Geht wirklich nur der Weg über INSTEAD OF Triggers, oder sieht jemand gerade eine Lösung bzw. hatte ein derartiges Problem bereits?

Vielen Dank für die Antworten!

Gruss
Fabian

Hallo,

ich habe noch ein wenig mit Trigger experimentiert. Dabei ist mir folgendes aufgefallen: Wenn ich einen Wert hinzufügen will (also NULL im Feld steht, d.h. kein Datensatz in PartMacAddress existiert), interpretiert der SQL Server dies als UPDATE und nicht INSERT! Ich denke dies ist das Problem, weiss jemand dazu mehr?

Versuchsweise habe ich ein Trigger erstellt, damit funktioniert es:
Code:
CREATE TRIGGER vwPartTrgUpd
            ON vwPart
    INSTEAD OF UPDATE
AS

DECLARE @PartId int, @MacAddress varchar(12);
SET     @PartId = (SELECT PartId FROM inserted);
SET     @MacAddress = (SELECT MacAddress FROM inserted);

BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

-- PartMacAddress       
       IF @MacAddress IS NOT NULL
       BEGIN
              -- Check for existing MacAddress. If no entry, do an insert.
              IF (NOT EXISTS (SELECT Opt.PartId
                              FROM PartMacAddress Opt
                              WHERE Opt.PartId = @PartId))
                     INSERT INTO PartMacAddress (PartId, MacAddress)
                     VALUES (@PartId, @MacAddress)
              ELSE
              -- MacAddress exists, do an update.
                     UPDATE PartMacAddress
                     SET    MacAddress = @MacAddress
                     WHERE  PartId LIKE @PartId
       END
END
Trotzdem wäre ich noch um eine Antwort froh, evtl fehlt ja nur eine Einstellung?
Danke und Gruss
Fabian
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
23. Jul 2013, 18:41
Rufname:


AW: Updatefähiges View - AW: Updatefähiges View

Nach oben
       Version: Office 2007

Hallo,

also 1:1-Tabellen habe ich persönlich bislang noch nicht verwenden müssen. Wie Du an dem Aufwand siehst, den Du hier betreibst, lohnt sich das auch nicht, da müßten schon SEHR viele Werte "ausgelagert" werden, so daß sich eine vertikale Teilung einer Tabelle lohnt.

Am einfachsten läßt Du das Feld Macadresse einfach in der Haupttabelle, wenn es nicht verwendet wird, laß es leer. Die Datensätze kannst Du einfach an einem Typindikator unterscheiden (der wiederum aus einer 1:n Nachschlagetabelle kommen kann), mehr ist nicht notwendig.

Da Du den Trigger auf die View anwendest und nicht auf die zugrundeliegenden Tabellen, wird der Trigger auch auf die View angewendet, jeder Datensatz der View komplett. Da Du nur die Macadresse der einen Tabelle eintragen möchtest, hast Du trotzdem keinen INSERT, weil die Felder der anderen Tabelle im gleichen Datensatz enthalten sind, also ist es für den Server ein UPDATE - logisch, oder?

Außerdem ist der Trigger nur ein INSTEAD OF UPDATE Trigger und kann somit ohnehin nur auf Updates reagieren.

Darüber hinaus solltest Du 1.) möglichst sparsam mit Triggern umgehen, sie können viel Performance kosten und 2.) beim Design von Triggern IMMER beachten, daß ein Trigger je SQL Command nur EINMAL aufgerufen wird. Wenn Du also beispielsweise ein INSERT...SELECT auf die View loslassen würdest, würde Dein Trigger versagen, da er nur genau einen Datensatz zu verarbeiten versucht. Du mußt also immer sicherstellen, daß Du ALLE übergebenen Datensätze verarbeitest, die Hilfstabellen "inserted" und "deleted" heißen nicht umsonst HilfsTABELLEN, weil sie mehr als einen Datensatz beinhalten können.

Gruß

Christian
RoKz
Gast


Verfasst am:
24. Jul 2013, 10:50
Rufname:

AW: Updatefähiges View - AW: Updatefähiges View

Nach oben
       Version: Office 2007

Hallo Christian, vielen Dank für die ausführliche Antwort.

Zitat:
also 1:1-Tabellen habe ich persönlich bislang noch nicht verwenden müssen. Wie Du an dem Aufwand siehst, den Du hier betreibst, lohnt sich das auch nicht, da müßten schon SEHR viele Werte "ausgelagert" werden, so daß sich eine vertikale Teilung einer Tabelle lohnt.

Am einfachsten läßt Du das Feld Macadresse einfach in der Haupttabelle, wenn es nicht verwendet wird, laß es leer. Die Datensätze kannst Du einfach an einem Typindikator unterscheiden (der wiederum aus einer 1:n Nachschlagetabelle kommen kann), mehr ist nicht notwendig.
Der Grund für die Auslagerung ist, dass nebst der MAC-Adresse noch weitere solche Felder existieren, d.h. dies war nur ein verkleinertes Beispiel meines Problems. Deshalb werde ich dies so lassen, deine vorgeschlagene Variante hatte ich früher bereits und wurde nun auch in Anbetracht für den Gebrauch in Zukunft abgeändert.

Zitat:
Da Du den Trigger auf die View anwendest und nicht auf die zugrundeliegenden Tabellen, wird der Trigger auch auf die View angewendet, jeder Datensatz der View komplett. Da Du nur die Macadresse der einen Tabelle eintragen möchtest, hast Du trotzdem keinen INSERT, weil die Felder der anderen Tabelle im gleichen Datensatz enthalten sind, also ist es für den Server ein UPDATE - logisch, oder?

Außerdem ist der Trigger nur ein INSTEAD OF UPDATE Trigger und kann somit ohnehin nur auf Updates reagieren.
Ja, es ist logisch (deshalb auch INSTEAD OF UPDATE, was ich nach einigem Ausprobieren herausgefunden habe Wink). Aber wie geht denn das mit updatefähigen Views, welche Felder aus mehreren Tabellen haben, genau, hast du das schonmal gemacht?

Zitat:
Darüber hinaus solltest Du 1.) möglichst sparsam mit Triggern umgehen, sie können viel Performance kosten und 2.) beim Design von Triggern IMMER beachten, daß ein Trigger je SQL Command nur EINMAL aufgerufen wird. Wenn Du also beispielsweise ein INSERT...SELECT auf die View loslassen würdest, würde Dein Trigger versagen, da er nur genau einen Datensatz zu verarbeiten versucht. Du mußt also immer sicherstellen, daß Du ALLE übergebenen Datensätze verarbeitest, die Hilfstabellen "inserted" und "deleted" heißen nicht umsonst HilfsTABELLEN, weil sie mehr als einen Datensatz beinhalten können.
Vielen Dank für die Hinweise! Ich werde den Trigger dann nochmals überarbeiten müssen Very Happy. Oder es gibt doch eine andere Lösung mittels updatefähigem View?

Gruss
Fabian
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
24. Jul 2013, 11:27
Rufname:


AW: Updatefähiges View - AW: Updatefähiges View

Nach oben
       Version: Office 2007

Hallo Fabian,

nein, habe ich selbst noch nicht gemacht, da bisher noch nicht notwendig. Bei komplizierteren Datenänderungen verwende ich i.d.R. eine SP, die entsprechende Parameter entgegennimmt und lasse diese die Arbeit erledigen. Allerdings muß man dann auf manche Access-Automatismen verzichten und mehr manuell programmieren.

Damit Du "ganz normal" mit INSERT, UPDATE und DELETE arbeiten kannst, reicht es auch nicht, wenn Du den Trigger nur einfach auf eine bestimmte Tabelle beziehst. "INSTEAD OF" bedeutet, daß SQL Server den jeweiligen Befehl zwar entgegennimmt, aber sobald ein INSTEAD OF Trigger vorhanden ist, wird nur der Triggercode ausgeführt, sonst nichts. Mit Deinem Triggercode würde das also bedeuten, daß Deine View wieder nicht updatefähig ist, weil Du lediglich eine der beiden Tabellen beschreibst und die andere ignorierst. In "inserted" und "deleted" stehen aber ALLE Felder BEIDER Tabellen drin, die in der View enthalten sind, also mußt Du auch alle entgegennehmen und adäquat verarbeiten. Ebenso genügt es dann nicht, nur einen INSTEAD OF UPDATE-Trigger zu schreiben, denn dann könntest Du nur noch Daten ändern, aber nicht mehr einfügen und nicht mehr löschen. Um also wieder voll kompatibel zu INSERT, UPDATE und DELETE zu sein, mußt Du je einen INSTEAD OF-Trigger für jeden dieser drei Befehle schreiben, der a) alle Felder beider Tabellen berücksichtigt und b) möglicherweise mehr als eine Zeile gleichzeitig ändern können muß.

Im Fall einer View, die über mehrere Tabellen geht, mußt Du auch beachten, was als INSERT und was als UPDATE gewertet wird: Ein INSERT liegt nur dann vor, wenn in beide Tabellen jeweils eine neue Zeile geschrieben werden soll. Ein UPDATE liegt vor, wenn in mind. einer der beiden Tabellen ein Wert verändert werden soll, auch wenn das bedeutet, daß nur in einer der beiden Tabellen eine neue Zeile hinzugefügt werden soll.

Weiterhin lernt man beim Schreiben eines Triggers schnell, daß es eigentlich gar keinen UPDATE-Befehl gibt. Es werden nur die beiden Hilfstabellen "inserted" und "deleted" zur Verfügung gestellt: Weil ein UPDATE eigentlich bedeutet, daß die Originalzeile gelöscht wird und eine neue Zeile eingefügt wird, wenn auch zum Teil mit alten Daten.

Außerdem solltest Du höllisch aufpassen, daß Du mit Triggern nicht anderen Triggern in's Gehege kommst. Wenn Du etwa auf eine der Basistabellen weitere Trigger verwendest, werden diese im Ablauf Deines View-Triggers auch aufgerufen und können damit u.U. Probleme verursachen, auf deren Ursache Du beim Lesen einer Fehlermeldung nicht unbedingt kommst...

Gruß

Christian
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Microsoft Access und MS SQL Server: Anmeldungen aus dem SQL-Server als Sicht / View? 6 stefaktiv 469 20. Sep 2013, 20:00
stefaktiv Anmeldungen aus dem SQL-Server als Sicht / View?
Keine neuen Beiträge Microsoft Access und MS SQL Server: Filtermöglichkeit von view bei der Einbindung? 1 peeka 296 02. Sep 2013, 21:52
MAPWARE Filtermöglichkeit von view bei der Einbindung?
Keine neuen Beiträge Microsoft Access und MS SQL Server: Problem mit View 0 trekking 297 26. März 2013, 22:32
trekking Problem mit View
Keine neuen Beiträge Microsoft Access und MS SQL Server: Parameterwerte an eine Sicht/View übergeben 7 Edgar 1094 16. März 2013, 22:14
Bitsqueezer Parameterwerte an eine Sicht/View übergeben
Keine neuen Beiträge Microsoft Access und MS SQL Server: Diagramm wird in anderer Sortierung angezeigt als View 1 hneuse 305 14. Jan 2013, 18:48
mikael Diagramm wird in anderer Sortierung angezeigt als View
Keine neuen Beiträge Microsoft Access und MS SQL Server: Microsoft SQL-Server - INSERT in eine View - Wie? 9 thunder1902 1075 05. Dez 2012, 13:00
Bitsqueezer Microsoft SQL-Server  - INSERT in eine View - Wie?
Keine neuen Beiträge Microsoft Access und MySQL: My SqL bei View ein Abfrage Kriterium eingeben wie geht das? 0 padrino 545 08. Okt 2012, 13:35
padrino My SqL bei View ein Abfrage Kriterium eingeben wie geht das?
Keine neuen Beiträge Microsoft Access und MS SQL Server: Wenn dann Formel in einem View einfügen 3 Ulle84 1981 25. Jun 2010, 19:33
Nouba Wenn dann Formel in einem View einfügen
Keine neuen Beiträge Microsoft Access und MS SQL Server: Bug in View?? 5 Homer J. Simpson 1392 07. Dez 2009, 17:21
Stephan T. Bug in View??
Keine neuen Beiträge Microsoft Access und MS SQL Server: MS SQL View: wie zwei Felder aneinander hängen? 1 Gast 2715 01. Okt 2009, 13:01
Bitsqueezer MS SQL View: wie zwei Felder aneinander hängen?
Keine neuen Beiträge Microsoft Access und MS SQL Server: von mdb auf View (SQL-Server) zugreifen 5 StefanWW 3634 20. Feb 2008, 14:47
--Gast-- von mdb auf View (SQL-Server) zugreifen
Keine neuen Beiträge Microsoft Access und andere Datenbank-Server: ms sql csv-spalte in view als einzelne spalten darstellen 0 Marco Richter 2659 25. Jun 2007, 08:55
Marco Richter ms sql csv-spalte in view als einzelne spalten darstellen
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Project