RowVersion SQL 2008 R2. Update und Delete mittels MS-ACCESS 2010 bringen Fehler oder Warnmeldung.
In eine Tabelle auf dem SQL-SERVER sollen Werte einer weiteren Tabelle geschrieben werden, dazu werden Insert, Delete und Update genutzt. Diese Anweisungen werden durch eine gespeicherte Prozedur auf dem SERVER gegeben, die GP über ein MS-ACCESS Projekt 2010 ausgelöst. Die offensichtlich durch Rowversion und Primary Key ausgelösten Warnmeldungen erscheinen auf der MS-ACCESS - Oberfläche und sind unerwünscht.
Vorab: Ich habe im Netz gestöbert (msdn, blog von olafhelper) und möglicherweise ein grundsätzliches Verständnisproblem zu Transact-SQL und direkt auf dem Server ausgelösten Kommandos (?). Ein MS-ACCESS Unterformular im (*.adp) besaß bisher ungebundene Textfelder. Die dort eingetragenen Werte wurden z.B. mit Docmd.RunSQL (oder ADO.Recordset) in der SERVER-Tabelle verarbeitet. Neuerdings aber habe ich das Unterformular an eine andere Tabelle gebunden. Die muß ja einen Primary Key Identity besitzen, sonst können die Felder nicht editiert werden. Ein Befehlsfeld in ACCESS 2010 startet dann die o.g. GP, in welcher Werte der großen Hauptabelle mit der an das Unterformular gebunden verglichen werden. Dortin der Hauptabelle gibt es keinen Primary Key und kein timestamp bzw. rowversion (Zumindest nicht von mir angelegt). INSERT ist.ok., DELETE und UPDATE funktionieren zwar auch, aber ACCESS meldet diesen Vorgang als lästigen Hinweis jedesmal. Beide Tabellen befinden sich auf dem gleichen SQl-SERVER. Will ich vor diesen UPDATES in der kleineren, an das UF gebundenen Tabelle die rowversion ändern/anpassen - wie in den Beispielen im Netz dargestellt -, so meldet der SERVER bereits beim Speicherversuch der GP im SERVER-Management-Studio Fehler (z.B. das in timestamp-Spalten nichts verändert werden darf o.ä.). Schön wäre ein kurzes Beispiel aber auch ggf. ein Hinweis, wo denn mein Denkfehler liegt, denn es funktioniert ja offenbar bei Anderen (bei mir wird z.B. auch das GO in einer GP im SERVER-Management-Studio nicht akzeptiert,in vielen Beiträgen findet man dies aber, wird teilweise sogar empfohlen).
Danke an alle, die sich hierfür Zeit nehmen.
PCFJKG
Vorab: Ich habe im Netz gestöbert (msdn, blog von olafhelper) und möglicherweise ein grundsätzliches Verständnisproblem zu Transact-SQL und direkt auf dem Server ausgelösten Kommandos (?). Ein MS-ACCESS Unterformular im (*.adp) besaß bisher ungebundene Textfelder. Die dort eingetragenen Werte wurden z.B. mit Docmd.RunSQL (oder ADO.Recordset) in der SERVER-Tabelle verarbeitet. Neuerdings aber habe ich das Unterformular an eine andere Tabelle gebunden. Die muß ja einen Primary Key Identity besitzen, sonst können die Felder nicht editiert werden. Ein Befehlsfeld in ACCESS 2010 startet dann die o.g. GP, in welcher Werte der großen Hauptabelle mit der an das Unterformular gebunden verglichen werden. Dortin der Hauptabelle gibt es keinen Primary Key und kein timestamp bzw. rowversion (Zumindest nicht von mir angelegt). INSERT ist.ok., DELETE und UPDATE funktionieren zwar auch, aber ACCESS meldet diesen Vorgang als lästigen Hinweis jedesmal. Beide Tabellen befinden sich auf dem gleichen SQl-SERVER. Will ich vor diesen UPDATES in der kleineren, an das UF gebundenen Tabelle die rowversion ändern/anpassen - wie in den Beispielen im Netz dargestellt -, so meldet der SERVER bereits beim Speicherversuch der GP im SERVER-Management-Studio Fehler (z.B. das in timestamp-Spalten nichts verändert werden darf o.ä.). Schön wäre ein kurzes Beispiel aber auch ggf. ein Hinweis, wo denn mein Denkfehler liegt, denn es funktioniert ja offenbar bei Anderen (bei mir wird z.B. auch das GO in einer GP im SERVER-Management-Studio nicht akzeptiert,in vielen Beiträgen findet man dies aber, wird teilweise sogar empfohlen).
Danke an alle, die sich hierfür Zeit nehmen.
PCFJKG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 171433
Url: https://administrator.de/contentid/171433
Ausgedruckt am: 27.11.2024 um 21:11 Uhr
14 Kommentare
Neuester Kommentar
Moin Moin,
Grüße aus Rostock
Wolfgang
(Netwolf)
Bestätigung bei Änderung/Löschen ist das Kästchen nicht angehakt).
diese Einstellung war gemeint, damit werden die lästigen Meldungen normaler Weise abgeschaltet.Falls nicht, hast Du trotzdem eine Idee warum der Scrip unten nicht mit dem SQL-SERVER-Management-Studio angelegt werden kann und Fehler bringt
da muss ich noch forschen ....Grüße aus Rostock
Wolfgang
(Netwolf)
Moin PCFJKG,
lass bitte mal das USE tempdb weg - eine USE database-Anweisung wird in StPs oder Triggern immer intern implizit gesetzt (und lässt sich im Umkehrschluss nicht explizit angeben).
Qualifiziere stattdessen die Tabellen/Datenbankobjektangaben voll z.B.
Dann wird ja auch - wie es dein Plan ist- TempDB angefasst, "um mit @@DBTS die richtigen Werte zu bekommen".
Grüße
Biber
lass bitte mal das USE tempdb weg - eine USE database-Anweisung wird in StPs oder Triggern immer intern implizit gesetzt (und lässt sich im Umkehrschluss nicht explizit angeben).
Qualifiziere stattdessen die Tabellen/Datenbankobjektangaben voll z.B.
CREATE [dbo].[tempdb].#TS
Dann wird ja auch - wie es dein Plan ist- TempDB angefasst, "um mit @@DBTS die richtigen Werte zu bekommen".
Grüße
Biber
Moin PCFJKG,
ich bin jetzt ein bisschen am Schwimmen, was deinen Plan angeht.
nochmal grundsätzlich...
Die Fehlermeldung 272 ("Spalte vom Typ timestamp ist nicht updatable") ist natürlich gerechtfertigt, denn der Typ "Timestamp" hat nix,nix, nix mit den SQL-Datentypen Datum oder Zeit zu tun, sondern steht als Synonym für "Rowversion".
Also genau diese Binary-Repräsentation, die du auch in Weiten des Netzes ausgraben hast.
Dat Dingen kann der SQL-Server handeln, du aber nicht (per UPDATE-Statement).
ich frag mal anders - was würdest du denn (von der Programmlogik her) aus einem geänderten Wert in der Timestamp-Spalte ableiten wollen?
Grüße
Biber
ich bin jetzt ein bisschen am Schwimmen, was deinen Plan angeht.
nochmal grundsätzlich...
Die Fehlermeldung 272 ("Spalte vom Typ timestamp ist nicht updatable") ist natürlich gerechtfertigt, denn der Typ "Timestamp" hat nix,nix, nix mit den SQL-Datentypen Datum oder Zeit zu tun, sondern steht als Synonym für "Rowversion".
Also genau diese Binary-Repräsentation, die du auch in Weiten des Netzes ausgraben hast.
Dat Dingen kann der SQL-Server handeln, du aber nicht (per UPDATE-Statement).
ich frag mal anders - was würdest du denn (von der Programmlogik her) aus einem geänderten Wert in der Timestamp-Spalte ableiten wollen?
Grüße
Biber
Moin PCFJKG,
ich bin eher skeptisch, ob du da an der richtigen Stelle gräbst.
Wenn denn am Ende des Tages bzw. beim Schliessen des Hauptforulars gemeckert wird, dass dieser Satz geändert wurde (seit dem letzten Lesen)...
-> dann würde ich behaupten, dieser Hauptformular-Datensatz ist nach den UPDATEs meinetwegen durch eine StP nicht refresht/neu gelesen worden.
Eventuell hast du dir dadurch ein Bein gestellt, dass du Änderungen sowohl direkt im Hauptformular zulässt und ebenso Änderungen desselben Satzes über Bande/über Unterformular.
Wäre denn dann nicht eine geschicktere Strategie, wenn bei jedem Wechseln (=focus on) von Haupt- auf Unterformular et vice versa ein Refresh des Hauptformulardatensatzes angeschubst wird?
Grüße
Biber
ich bin eher skeptisch, ob du da an der richtigen Stelle gräbst.
Wenn denn am Ende des Tages bzw. beim Schliessen des Hauptforulars gemeckert wird, dass dieser Satz geändert wurde (seit dem letzten Lesen)...
-> dann würde ich behaupten, dieser Hauptformular-Datensatz ist nach den UPDATEs meinetwegen durch eine StP nicht refresht/neu gelesen worden.
Eventuell hast du dir dadurch ein Bein gestellt, dass du Änderungen sowohl direkt im Hauptformular zulässt und ebenso Änderungen desselben Satzes über Bande/über Unterformular.
Wäre denn dann nicht eine geschicktere Strategie, wenn bei jedem Wechseln (=focus on) von Haupt- auf Unterformular et vice versa ein Refresh des Hauptformulardatensatzes angeschubst wird?
Grüße
Biber