Supportnet / Forum / Datenbanken
MS Access - Nur Änderungen eigener Datensätze erlauben
Frage
Liebe Experten,
ich versuche eine MS Access Anwendung für eine Mehrnutzerumgebung zu entwerfen.
Sicherheit auf Benutzerebene ist eingerichtet.
Jedem Nutzer soll es erlaubt sein, nur von ihm selbst angelegte Datensätze zu ändern.
Ist es besser, die von verschiedenen Nutzern eingegebenen Daten in verschiedenen Tabellen abzulegen oder gibt es Möglichkeiten, anhand eines Tabellenfeldes das Ändern des Datensatzes zu erlauben/ zu verweigern?
Wie kann man ausserdem z.B. den Nutzernamen des gerade eingeloggten Nutzers automatisch in ein Tabellenfeld übertragen?
Vielen Dank für jeden Hinweis, Tipp oder Link
Masanja
Antwort 1 von Hilfsente
Hallo,
ich würde alles in einer Tabelle machen. Dazu in einem zusätzlichen Feld den Benutzer mit abspeichern, der den datensatz angelegt hat.
Dann musst du nur verproben, ob der angemeldete Benutzer mit dem Eintrag in der Tabelle übereinstimmt und abhängig davon in deinem Formular Änderungen zulassen oder nicht.
Gruss Hilfsente
ich würde alles in einer Tabelle machen. Dazu in einem zusätzlichen Feld den Benutzer mit abspeichern, der den datensatz angelegt hat.
Dann musst du nur verproben, ob der angemeldete Benutzer mit dem Eintrag in der Tabelle übereinstimmt und abhängig davon in deinem Formular Änderungen zulassen oder nicht.
Gruss Hilfsente
Antwort 2 von Masanja
Hallo Hilfsente,
ja, das wäre auch meine bevorzugte Strategie.
Über welche Objekte/ Anweisungen kann man das verproben? Oder hast du einen Verweis auf eine Quelle, wo das erklärt wird?
Vielen Dank
Masanja
ja, das wäre auch meine bevorzugte Strategie.
Zitat:
Dann musst du nur verproben, ob der angemeldete Benutzer mit dem Eintrag in der Tabelle übereinstimmt und abhängig davon in deinem Formular Änderungen zulassen oder nicht.
Dann musst du nur verproben, ob der angemeldete Benutzer mit dem Eintrag in der Tabelle übereinstimmt und abhängig davon in deinem Formular Änderungen zulassen oder nicht.
Über welche Objekte/ Anweisungen kann man das verproben? Oder hast du einen Verweis auf eine Quelle, wo das erklärt wird?
Vielen Dank
Masanja
Antwort 3 von erik
Für jeden Benutzer eine Tabelle anzulegen wäre absoluter Wahnsinn, sofern du nicht auf einen SQL Server zugreifst. Den Wartungsaufwand kann man keinem Menschen zumuten.
Wie schon Hilfsente angedeutet hat, solltest du in jeder Tabelle ein weiteres Feld hinzufügen, in dem der Name des aktuellen Benutzers eingetragen werden. Wenn ein neuer Datensatz angelegt wird, dann wäre z.B. das Ereignis "Nach Eingabe" geeignet:
Private Sub Form_AfterInsert()
Me.BenutzerName = CurrentUser()
End Sub
Wenn ein fremder Benutzer den Datenzugriff wagt, dann gäbe es zwei Möglichkeiten, den Zugriff zu verhindern. Von vornherein könnte das Recht zum Bearbeiten und Löschen des Datensatzes entzogen werden. Ist es der richtige Benutzer, dann wird das Recht wiederum erteilt. Dazu eignet sich das Ereignis "Beim Anzeigen":
Private Sub Form_Current()
Me.AllowEdits=CBool(Me.BenutzerName = CurrentUser())
Me.AlllowDeletions = CBool(Me.BenutzerName = CurrentUser())
End Sub
Weiterhin wäre es möglich, direkt vor dem Speicherversuch selbiges zu verweigern. Allerdings wäre es aus der Sicht des Anwenders ärgerlich, wenn er mühsam Änderungen durchführt, nur um sie dann verwerfen zu müssen. Von daher sollte diese Variante eher nicht genutzt werden:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.BenutzerName <> CurrentUser() Then
MsgBox "Sie haben keinen Zugriff auf diese Daten.", vbExclamation
Cancel = True
End if
End Sub
Wenn der Anwender sowieso nur seine eigenen Daten sehen soll, dann kannst du die fremden Daten von vornherein komplett ausblenden:
Private Sub Form_Load()
Me.Filter= "BenutzerName = ´" & CurrentUser() & "´"
Me.FilterOn = True
End Sub
Viele Wege führen demnach nach Rom, du musst dir nur einen aussuchen. :-)
Wie schon Hilfsente angedeutet hat, solltest du in jeder Tabelle ein weiteres Feld hinzufügen, in dem der Name des aktuellen Benutzers eingetragen werden. Wenn ein neuer Datensatz angelegt wird, dann wäre z.B. das Ereignis "Nach Eingabe" geeignet:
Private Sub Form_AfterInsert()
Me.BenutzerName = CurrentUser()
End Sub
Wenn ein fremder Benutzer den Datenzugriff wagt, dann gäbe es zwei Möglichkeiten, den Zugriff zu verhindern. Von vornherein könnte das Recht zum Bearbeiten und Löschen des Datensatzes entzogen werden. Ist es der richtige Benutzer, dann wird das Recht wiederum erteilt. Dazu eignet sich das Ereignis "Beim Anzeigen":
Private Sub Form_Current()
Me.AllowEdits=CBool(Me.BenutzerName = CurrentUser())
Me.AlllowDeletions = CBool(Me.BenutzerName = CurrentUser())
End Sub
Weiterhin wäre es möglich, direkt vor dem Speicherversuch selbiges zu verweigern. Allerdings wäre es aus der Sicht des Anwenders ärgerlich, wenn er mühsam Änderungen durchführt, nur um sie dann verwerfen zu müssen. Von daher sollte diese Variante eher nicht genutzt werden:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.BenutzerName <> CurrentUser() Then
MsgBox "Sie haben keinen Zugriff auf diese Daten.", vbExclamation
Cancel = True
End if
End Sub
Wenn der Anwender sowieso nur seine eigenen Daten sehen soll, dann kannst du die fremden Daten von vornherein komplett ausblenden:
Private Sub Form_Load()
Me.Filter= "BenutzerName = ´" & CurrentUser() & "´"
Me.FilterOn = True
End Sub
Viele Wege führen demnach nach Rom, du musst dir nur einen aussuchen. :-)
Antwort 4 von Masanja
erik,
vielen Dank für diese ausführliche Hilfestellung! Genau die Art von Stichworten, die mich weiterbringt.
Besten Dank nochmals.
Masanja
vielen Dank für diese ausführliche Hilfestellung! Genau die Art von Stichworten, die mich weiterbringt.
Besten Dank nochmals.
Masanja