Excel und RecordSet(SELECT ....) nur ReadOnly
#1
Guten Tag
Ich habe im Excel eine lauffähige DAO RecordSet-  (SELECT)-Anweisung um Daten aus einer im Access verknüpften Tabelle auslesen zu können. Bis jetzt habe ich das ohne weitere Attribute. Ich habe lange an den Attributen herumstudiert, doch ich kann leider nicht ausmachen, was ich da genauer definierten könnte. Ich möchte erreichen, dass mehrere Anwender gleichzeitig von Excel aus in einer Access-DB Tabelle Werte auslesen können und zwar NUR LESERECHTE. Falls möglich soll es einer anderen Applikation doch möglich sein, Daten mit Lese-/Schreibrecht gleichzeitig hinzuzufügen, falls das Möglich ist. Was braucht es dazu bei den quasi "lesenden" Anwender an VBA-Code-Definition, dass das möglich wird?
Gruss und Danke
Stefan1
Antworten Top
#2
Hallo Stefan,

der Zugriff auf eine Access-Datenbank ist automatisch immer multiuser fähig, dafür braucht man nichts weiter, als Schreib-/Leseberechtigungen an der Datei und in dem Ordner.

Wenn du ein Recordset nur Leseberechtigt öffnen möchtest, kannst du das durch die Option Readonly erreichen. Wenn du die Datenbank nur lese berechtigt öffnen möchtest, setzt du bei DBEngine.Opendatabase() den Parameter Readonly auf true.

Doku:
https://learn.microsoft.com/de-de/office...-reference
Antworten Top
#3
SO setzt bzw löscht man den "Schreibrecht"-Status jeder Datei (die NICHT geöffnet sein darf):

Public Sub SchutzSetzen(nam) ' nam=DateiName mit kompl. Pfad
        SetAttr nam, vbReadOnly
End Sub
Public Sub SchutzWeg(nam) 'nam=DateiName mit kompl. Pfad
        SetAttr nam, vbNormal
End Sub
Antworten Top
#4
Guten Tag Knobbi38
Vielen Dank für den Hinweis. OK, mit readonly (nur Leserechte). Bedeutet das trotzdem, dass die Access-Datenbank im Exklusiv-Zugriff ist? Oder kann man sogar den Exklusiv-Zugriff (Reservierung) auch noch irgendwie ausschalten, so dass gleichzeitig ein Dritter mit Exklusiv-Zugriff trotzdem mit Lese-/Schreibrechte Daten verändern kann?
Gruss
Stefan1
Antworten Top
#5
" so dass gleichzeitig ein Dritter mit Exklusiv-Zugriff trotzdem mit Lese-/Schreibrechte Daten verändern kann? "
Was du mit " Exklusiv-Zugriff "wahrscheinlich meinst (dass nur ein bestimmter User drauf zugreifen kann), kann nur der Admin festlegen, aber das ändert nichts an der Tatsache, dass die Datei dabei NICHT von jemand Anderem geöffnet sein darf. 
Auf Deutsch: Du kannst Nix an der Datei ändern, wenn irgend Jemand sie bereits geöffnet hat, weil du dann automatisch nur Leserecht hast.
Antworten Top
#6
Hallöchen,

für lesenden Zugriff auf eine Oracle-DB hab ich z.B. so was. Sieht in Access ähnlich aus.

Set objDynaset = New ADODB.Recordset
objDynaset.Open sql_string, Me.Dbase, adOpenForwardOnly, adLockReadOnly

Zum Schreiben hab ich z.B. diese Parameter
dOpenKeyset, adLockOptimistic



Ist zwar jetzt nicht die Frage, aber mal als Zusatzinfo:

Bei einer "richtigen" Datenbank kann man das auch über Benutzerrollen steuern ...
Im Prinzip bekommt man so seine user aus Oracle ausgelesen
Set objDynaset = New ADODB.Recordset
objDynaset.Open "Select user from dual", Me.Dbase, adOpenForwardOnly, adLockReadOnly

und so z.B. Rechte
objDynaset.Open "Select count(*) as anz from user_role_privs " + _
" where granted_role = '__MYDB_WRITE'", _
Me.Dbase, adOpenForwardOnly, adLockReadOnly

siehe zu mysql z.B. https://youtu.be/ki3xWl10Ryc
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#7
Hallo Stefan,

du kannst beim Öffnen der Datenbank festlegen, ob diese im exklusiven Modus geöffnet wird oder nicht. Exklusiv bedeutet in diesem Zusammenhang, daß kein anderer Zugriff auf die DB hat.

Ich weiß jetzt nicht, worauf du hinaus möchtest und was dein gedankliches Problem mit Access-Datenbanken ist, da du ja nicht mit Access auf diese Datenbank zugreifst, sondern "nur" mit deiner DBEngine. Mit Einführung des accdb Dateiformates gibt es keine "Rechteverwaltung" auf unterster Ebene mehr. Zugriffsrechte werden nur noch in deiner Anwendung festgelegt; mit externen Anwendungen kann man jederzeit, wenn nicht exklusiv geöffnet und Zugriffsrechte auf Dateisystemebene erteilt sind, alles mit der Datenbank-Datei machen, es sei denn, es wird für die Datenbank ein Passwort festgelegt. 

Echte Sicherheit, wie sie eventuell vorschwebt, gibt es nur mit einem SQL-Server, z.B. dem kostenlosen MS SQL-Server Express-Edition (Hinweis: es gibt auch noch andere kostenlose SQL-Server).
Antworten Top
#8
Guten Tag knobbi38
Vielen Dank für Deine Rückmeldung. Es greifen mehrere Anwender gleichzeitig auf die Access-Datenbank zu und brauchen dort nur Daten. Das geschieht heute mit DAO (.OpenRecordSet, SELECT). 

Es gibt dazu folgende Eigenschaften einzustellen:

dbOpenTable
dbOpenDynaset
dbOpenSnapshot
dbOpenForwardOnly

.LockEdits = True (Sperre erst nach Update)

Dynaset (Default)
Snapshot (nur Lesen)

Die Anwender brauchen nur Lesezugriff. Es geht also um die opimale SELECT-Abfrage für den gewünschten Effekten, nämlich Werte auslesen nach Kriterien). Es muss in diese Access-Datenbank von den Anwender nichts mutiert oder neu hinzugefügt werden. Wenn jedoch eine andere Anwendung dabei separat ungestört neue Daten zufügen kann, umso besser. Was sind die Probleme, wenn die Eigenschaften eingestellt werden. Man sieht wenig Bespiele und belässt es oft beim Defaultwert. Ich frage mich was der Vorteil oder Nachteil sein soll. Es ist schon etwas verwirrend mit diesen Befehlen.
Antworten Top
#9
Es ist mir nicht ganz klar, worauf Du hinauswillst, aber vielleicht hilft KI (in der Hoffnung, dass sie nicht halluziniert 😂)

Hier ist eine zusammenfassende Erläuterung der drei DAO-Recordset-Öffnungsmodi: dbOpenForwardOnly, dbOpenSnapshot und dbOpenDynaset, einschließlich ihrer Vor- und Nachteile:
1. dbOpenForwardOnly
Beschreibung:
  • Erlaubt die Vorwärtsnavigation durch die Datensätze. Sie können nur die Methode MoveNext verwenden, um zum nächsten Datensatz zu gelangen.
Vorteile:
  • Leistungsoptimierung: Geringer Speicherbedarf und schnellere Leistung, da das Recordset keine zurückhaltenden Daten speichert.
  • Einfache Implementierung: Ideal für einfache Abfragen, bei denen nur eine Vorwärtsnavigation erforderlich ist.
Nachteile:
  • Eingeschränkte Navigation: Sie können nicht zu vorherigen Datensätzen zurückkehren, was die Flexibilität einschränkt.
  • Kein Schreibzugriff: Es handelt sich um einen schreibgeschützten Modus, der keine Datenbearbeitung ermöglicht.

2. dbOpenSnapshot
Beschreibung:
  • Erstellt eine schreibgeschützte Momentaufnahme der Daten zum Zeitpunkt des Öffnens des Recordsets. Sie können vorwärts navigieren, aber nicht rückwärts.
Vorteile:
  • Stabilität der Daten: Bietet eine konsistente Ansicht der Daten, die sich nicht ändert, während das Recordset geöffnet ist.
  • Leistungsoptimierung: Gut geeignet für Berichterstattung oder Analyse, bei der die Daten nicht verändert werden müssen.
Nachteile:
  • Eingeschränkte Navigation: Wie bei dbOpenForwardOnly können Sie nicht rückwärts durch die Datensätze navigieren.
  • Kein Schreibzugriff: Es handelt sich um einen schreibgeschützten Modus, der keine Änderungen an den Daten ermöglicht.

3. dbOpenDynaset
Beschreibung:
  • Bietet eine dynamische Ansicht auf die Daten, die sowohl Vorwärts- als auch Rückwärtsnavigation ermöglicht. Änderungen an den zugrunde liegenden Daten werden sofort im Recordset reflektiert.
Vorteile:
  • Vollständige Navigation: Ermöglicht das Blättern in beiden Richtungen (vorwärts und rückwärts) sowie die Verwendung von Methoden wie MoveFirst, MoveLast, MovePrevious und MoveNext.
  • Schreibzugriff: Ermöglicht das Lesen, Bearbeiten, Hinzufügen und Löschen von Datensätzen, wodurch es ideal für interaktive Anwendungen ist.
  • Dynamische Datenansicht: Änderungen an den Daten werden sofort reflektiert, was eine aktuelle Sicht auf die Daten garantiert.
Nachteile:
  • Leistungsaufwand: Kann mehr Speicher und Ressourcen beanspruchen als die anderen Modi, da eine dynamische Verbindung zur Datenquelle besteht.
  • Komplexität: Kann komplizierter sein, wenn Sie die Datenintegrität und Synchronisation mit anderen Benutzern berücksichtigen müssen.

Fazit:
  • dbOpenForwardOnly ist ideal für einfache, lesende Anwendungen, bei denen nur Vorwärtsnavigation benötigt wird.
  • dbOpenSnapshot eignet sich hervorragend für Berichterstattung und Analysen, bei denen Daten stabil bleiben müssen, aber keine Änderungen erforderlich sind.
  • dbOpenDynaset ist die vielseitigste Option für Anwendungen, die sowohl das Lesen als auch das Schreiben von Daten mit vollständiger Navigationsfreiheit erfordern.
Die Wahl des Modus hängt von den spezifischen Anforderungen Ihrer Anwendung ab, einschließlich der benötigten Navigationsmöglichkeiten, der Notwendigkeit von Schreibzugriffen und der gewünschten Datenstabilität.
[-] Folgende(r) 2 Nutzer sagen Danke an Warkings für diesen Beitrag:
  • knobbi38, Stefan1
Antworten Top
#10
Guten Abend Warkings

Vielen Dank für die tolle Auflistung, welches mein Verständnis für Access-Zugriffe erweitert. Ich werde mich mit dem 

dbOpenForwardOnly

weiter befassen und verstehe auch, dass dbForwardOnly nicht zu verwenden ist gemäss
https://documentation.help/DAO360/damtho...ordset.htm

Ich kann mir vorstellen, dass genauer spezifizierte SELECT (DAO)-Anweisungen nicht nur schneller, sondern allgemeiner auch stabiler sind. Auf jeden Fall traue ich den angetroffenen verkürzten SQL-Befehle im VBA von Excel nicht so ganz. Diese mögen zwar auch funktionieren, können aber auch langsamer sein. Der Defaultwert ohne dbOpenForwardOnly scheint bei OpenRecordset das langsamere dbOpenDynaset zu sein. Weil in meinem Fall jedoch nur Daten ausgelesen werden sollen, erhoffe ich mir mit dem genaueren SQL-Select und dbOpenForwardOnly schnellere Zugriffe zu haben und letztendlich auch stabiler das OpenRecordset und Access wieder beenden zu können, was mit RS.Close, DB.Close und Set RS = Nothing, Set DB = Nothing im DAO maximal mögliche ist.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste