{"id":55001193,"date":"2019-06-01T00:00:00","date_gmt":"2020-05-13T20:55:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1193"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Zugriffsrechte_mit_Datenmakros","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/","title":{"rendered":"Zugriffsrechte mit Datenmakros"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt verschiedene M&ouml;glichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die f&uuml;r ihn vorgesehenen Aktionen mit Daten durchf&uuml;hren darf &#8211; beispielsweise durch eine Pr&uuml;fung in den Ereignisprozeduren, die durch Ereignisse wie &#8222;Vor Aktualisierung&#8220; ausgel&ouml;st werden. Noch praktischer w&auml;re es allerdings, wenn diese Pr&uuml;fung nicht in jedem Formular programmiert werden m&uuml;sste, sondern anwendungsweit verf&uuml;gbar w&auml;re &#8211; also auch dann, wenn der Benutzer es schafft, ohne Formulare auf die Tabellen mit den Daten zuzugreifen. Das gelingt mit Datenmakros. Wie genau, zeigt der vorliegende Beitrag.<\/b><\/p>\n<h2>Grundlage f&uuml;r unsere Beispielanwendung<\/h2>\n<p>Wenn wir Datenmakros f&uuml;r Tabellen programmieren wollen, die daf&uuml;r sorgen, dass Benutzer abh&auml;ngig von ihrer Benutzergruppe und den f&uuml;r diese vergebenen Berechtigungen auf den verschiedenen Tabellen Daten an den Tabellen &auml;ndern k&ouml;nnen, ben&ouml;tigen wir einige Tabellen, in denen wir die Berechtigungen speichern. In unserem Fall haben wir in den Beitr&auml;gen <b>Benutzerverwaltung mit verschl&uuml;sselten Kennw&ouml;rtern <\/b>(<b>www.access-im-unternehmen.de\/1190<\/b>) und <b>Berechtigungen per HTML verwalten <\/b>(<b>www.access-im-unternehmen.de\/1191<\/b>) bereits einiges an Vorarbeit geleistet. Dort haben wir n&auml;mlich sowohl die Tabellen definiert, mit denen wir die Benutzer, Benutzergruppen, Tabellen und Berechtigungen sowie die Zuordnung der Berechtigungen zu den Kombinationen aus Benutzergruppen und Tabellen verwalten.<\/p>\n<h2>Ermitteln des aktuellen Benutzers<\/h2>\n<p>Um die Berechtigungen f&uuml;r den Zugriff auf eine Tabelle zu ermitteln, ben&ouml;tigen wir die Benutzerdaten. Dar&uuml;ber ermitteln wir die Benutzergruppe und schlie&szlig;lich die Berechtigung an der angegebenen Tabelle. Die Benutzerdaten haben wir im Beitrag <b>Benutzer und Berechtigungen ermitteln <\/b>(<b>www.access-im-unternehmen.de\/1192<\/b>) nach der Anmeldung in einer tempor&auml;ren Variablen gespeichert. Das hilft in einem Datenmakro leider nicht weiter, denn von dort aus k&ouml;nnen wir nicht auf tempor&auml;re Variablen zugreifen. Also m&uuml;ssen wir die Prozedur im Formular <b>frmAnmeldungen<\/b>, welche die Benutzerdaten nach der Pr&uuml;fung der Kombination aus Benutzername und Kennwort in tempor&auml;ren Variablen gespeichert hat, zun&auml;chst so &auml;ndern, dass die <b>BenutzerID <\/b>und der Benutzername in einer Tabelle landen &#8211; die in diesem Fall <b>tblOptionen <\/b>hei&szlig;en soll. Die Prozedur <b>cmdAnmelden_Click<\/b> &auml;ndern wir dazu wie in Listing 1. Die Prozedur tr&auml;gt zun&auml;chst den Benutzernamen aus dem Textfeld <b>txtBenutzername <\/b>in die Variable <b>strBenutzername <\/b>ein. Dann pr&uuml;ft sie mit der Funktion <b>AnmeldungPruefen<\/b>, ob die Anmeldedaten korrekt sind. Ist dies der Fall, ermittelt sie per <b>DLookup <\/b>den Wert des Feldes <b>BenutzerID <\/b>f&uuml;r den angegebenen Benutzernamen und speichert diesen in der Variablen <b>lngBenutzerID<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAnmelden_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>strBenutzername<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBenutzerID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strBenutzername = Nz(Me!txtBenutzername, \"\")\r\n     <span style=\"color:blue;\">If <\/span>AnmeldungPruefen(strBenutzername, Nz(Me!txtKennwort, \"\")) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         lngBenutzerID = DLookup(\"BenutzerID\", \"tblBenutzer\", \"Benutzername = ''\" & strBenutzername & \"''\")\r\n         db.Execute \"UPDATE tblOptionen SET Benutzername = ''\" & strBenutzername & \"'', BenutzerID = \" & lngBenutzerID, _\r\n             dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>db.RecordsAffected = 0<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblOptionen(Benutzername, BenutzerID) VALUES(''\" & strBenutzername & \"'', \" _\r\n                 & lngBenutzerID & \")\", dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         DoCmd.Close acForm, Me.Name\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Anmeldung nicht erfolgreich.\"\r\n         db.Execute \"INSERT INTO tblOptionen(Benutzername, BenutzerID) VALUES(\"\", 0)\", dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>db.RecordsAffected = 0<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"UPDATE tblOptionen SET Benutzername = '''' AND BenutzerID = 0\", dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Speichern der Daten nach der Anmeldung in der Tabelle tblOptionen<\/span><\/b><\/p>\n<p>Damit versucht sie, die beiden Felder <b>Benutzername <\/b>und <b>BenutzerID <\/b>in der Tabelle <b>tblOptionen <\/b>durch den Aufruf einer <b>UPDATE<\/b>-Anweisung auf die neuen Werte zu aktualisieren. Ob das gelungen ist, zeigt die Eigenschaft <b>RecordsAffected <\/b>im Anschluss. Liefert sie den Wert <b>0<\/b>, wurde kein Datensatz ge&auml;ndert, was nur bedeuten kann, dass noch kein Datensatz vorhanden ist. In diesem Fall ruft die Prozedur eine <b>INSERT INTO<\/b>-Anweisung auf und f&uuml;gt einen neuen Datensatz mit den gew&uuml;nschten Werten zur Tabelle <b>tblOptionen <\/b>hinzu.<\/p>\n<p>Sollte die Funktion <b>AnmeldungPruefen <\/b>den Wert <b>False <\/b>zur&uuml;ckgeliefert haben, f&uuml;llt die Prozedur auf die gleiche Art das Feld <b>BenutzerID <\/b>mit dem Wert <b>0 <\/b>und <b>Benutzername <\/b>mit einer leeren Zeichenkette.<\/p>\n<h2>&Auml;ndern per Datenmakro unterbinden<\/h2>\n<p>Wenn wir etwa das &Auml;ndern der Daten eines Datensatzes unterbinden wollen, k&ouml;nnen wir das durch ein ganz einfaches Datenmakro erledigen. Wir schauen uns das am Beispiel der Tabelle <b>tblKunden <\/b>an, f&uuml;r die wir &Auml;nderungen zun&auml;chst komplett verhindern wollen. Dazu legen wir ein Datenmakro an, indem wir bei in der Datenblattansicht ge&ouml;ffneter Tabelle den Ribbon-Eintrag <b>Tabelle|Vorabereignisse|Vor &Auml;nderung <\/b>anklicken (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_002.png\" alt=\"Anlegen eines Datenmakros per Ribbon-Befehl\" width=\"599,593\" height=\"171,71\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen eines Datenmakros per Ribbon-Befehl<\/span><\/b><\/p>\n<p>Das &ouml;ffnet den Makro-Editor f&uuml;r dieses Makro, dem wir nur eine einzige Makro-Aktion hinzuf&uuml;gen (siehe Bild 2). Diese enth&auml;lt den Befehl <b>Ausl&ouml;senFehler <\/b>mit der Nummer <b>1 <\/b>und dem Text <b>&Auml;ndern nicht m&ouml;glich <\/b>als Fehlerbeschreibung.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_001.png\" alt=\"Einfaches Makro zum Unterbinden von &Auml;nderungen\" width=\"424,7115\" height=\"163,1897\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einfaches Makro zum Unterbinden von &Auml;nderungen<\/span><\/b><\/p>\n<p>Wenn Sie nun den Makro-Editor schlie&szlig;en und versuchen, einen der Datens&auml;tze der Tabelle <b>tblKunden <\/b>zu &auml;ndern, erhalten Sie beim Speichern die Meldung aus Bild 3. Ein &auml;hnliches Datenmakro k&ouml;nnen Sie f&uuml;r das Ereignis <b>Vor L&ouml;schung <\/b>anlegen &#8211; in diesem Fall mit einer entsprechenden Fehlermeldung wie <b>L&ouml;schen nicht m&ouml;glich<\/b>. Wenn Sie nun versuchen, einen der Datens&auml;tze zu l&ouml;schen, wird das ebenfalls nicht gelingen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_003.png\" alt=\"Meldung beim Versuch, einen Datensatz zu &auml;ndern\" width=\"549,6265\" height=\"248,2481\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Meldung beim Versuch, einen Datensatz zu &auml;ndern<\/span><\/b><\/p>\n<p>Was aber geschieht, wenn wir einen neuen Datensatz anlegen m&ouml;chten Dann erscheint die gleiche Meldung wie beim Versuch, den Datensatz zu &auml;ndern. Hier m&uuml;ssen wir also noch differenzieren. Das erledigen wir im Datenmakro f&uuml;r das Ereignis <b>Vor &Auml;nderung<\/b>, indem wir eine <b>Wenn<\/b>-Bedingung hinzuf&uuml;gen, f&uuml;r die wir die Bedingung <b>IstNull([Alt].[KundeID]) <\/b>festlegen (siehe Bild 4). <b>Alt <\/b>enth&auml;lt ein Recordset mit den Daten des Datensatzes vor dem &Auml;ndern. Bei einem vorhandenen Datensatz liefert <b>KundeID <\/b>den zwangsl&auml;ufig vorhandenen Prim&auml;rschl&uuml;sselwert, beim Anlegen eines neuen Datensatzes ist <b>[Alt].[KundeID] <\/b>leer, als <b>NULL<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_004.png\" alt=\"Unterscheidung von neuen und vorhandenen Datens&auml;tzen beim &Auml;ndern\" width=\"499,6607\" height=\"422,7898\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Unterscheidung von neuen und vorhandenen Datens&auml;tzen beim &Auml;ndern<\/span><\/b><\/p>\n<p>Wenn dies der Fall ist, soll das Makro die Meldung <b>Anlegen nicht m&ouml;glich <\/b>ausgeben, sonst <b>&Auml;ndern nicht m&ouml;glich<\/b> (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_005.png\" alt=\"Meldung beim Versuch, einen neuen Datensatz anzulegen\" width=\"499,6607\" height=\"220,6294\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Meldung beim Versuch, einen neuen Datensatz anzulegen<\/span><\/b><\/p>\n<h2>Anmeldung pr&uuml;fen<\/h2>\n<p>Damit kommen wir zu dem Punkt, wo wir die Meldungen nur in Abh&auml;ngigkeit von den Berechtigungen des Benutzers an der jeweiligen Tabelle anzeigen wollen.<\/p>\n<p><!--30percent--><\/p>\n<p>Wenn also etwa ein Benutzer angemeldet ist, der Daten der Tabelle <b>tblKunden <\/b>anlegen und &auml;ndern, diese aber nicht l&ouml;schen darf, soll nur das L&ouml;schen von Datens&auml;tzen unterbunden werden.<\/p>\n<h2>Abfrage zum Ermitteln der Berechtigung<\/h2>\n<p>Da wir nun die Daten des aktuellen Benutzers in einer Tabelle namens <b>tblOptionen <\/b>speichern und diese auch den Wert des Prim&auml;rschl&uuml;sselfeldes des angemeldeten Benutzers enth&auml;lt, k&ouml;nnen wir eine Abfrage erstellen, welche diese Daten der Tabelle <b>tblOptionen <\/b>nutzt. Dazu f&uuml;gen wir dieser Abfrage, die wir unter dem Namen <b>qryTabellenberechtigungen <\/b>speichern wollen, die Tabellen aus Bild 6 hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_006.png\" alt=\"Abfrage zum Ermitteln der Berechtigungen \" width=\"700\" height=\"366,2703\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Abfrage zum Ermitteln der Berechtigungen <\/span><\/b><\/p>\n<p>Hier sehen Sie auch, dass wir nur zwei Felder zum Entwurfsraster hinzuf&uuml;gen, n&auml;mlich <b>Tabelle <\/b>und <b>BerechtigungID<\/b>. Das reicht aus, um zu ermitteln, ob der aktuelle Benutzer eine bestimmte Berechtigung f&uuml;r eine Tabelle hat. Den aktuellen Benutzer ermitteln wir ja bereits &uuml;ber die Tabelle <b>tblOptionen<\/b>, daher m&uuml;ssen wir die Daten der Abfrage nur noch nach dem Namen der zu untersuchenden Tabelle und der zu ber&uuml;cksichtigenden Berechtigung filtern.<\/p>\n<p>Denn wir wollen ja nicht alle Berechtigungen des Benutzers an einer Tabelle ermitteln, sondern nur pr&uuml;fen, ob der Benutzer &uuml;ber eine bestimmte Berechtigung verf&uuml;gt. Im Datenmakro <b>Vor L&ouml;schung <\/b>etwa wollen wir nur wissen, ob der aktuell angemeldete Benutzer etwa f&uuml;r die Tabelle <b>tblKunden <\/b>&uuml;ber das <b>L&ouml;schen<\/b>-Recht verf&uuml;gt, also das Recht mit dem Wert <b>8<\/b>. Die Berechtigungen f&uuml;r den aktuellen Benutzer liefert die Abfrage etwa wie in Bild 7. Wenn wir die Abfrage nun nach der Tabelle <b>tblKunden <\/b>und der <b>BerechtigungID <\/b>mit dem Wert <b>8 <\/b>filtern, erhalten wir nur noch einen Datensatz &#8211; oder eben keinen, falls diese Berechtigung f&uuml;r den Kunden nicht festgelegt wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_007.png\" alt=\"Berechtigungen f&uuml;r den aktuellen Benutzer\" width=\"424,7115\" height=\"514,963\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Berechtigungen f&uuml;r den aktuellen Benutzer<\/span><\/b><\/p>\n<h2>Datenmakro zum Pr&uuml;fen der Berechtigung vor dem L&ouml;schen<\/h2>\n<p>Das Datenmakro <b>Vor L&ouml;schung <\/b>der Tabelle <b>tblKunden<\/b> soll nun pr&uuml;fen, ob es einen Datensatz in der Abfrage <b>qryTabellenberechtigungen<\/b> gibt, der die Bedingung aus Bild 8 erf&uuml;llt. Dazu f&uuml;gen wir die Makroaktion <b>Datensatz nachschlagen in <\/b>hinzu und geben die Abfrage <b>qryTabellenberechtigungen <\/b>als Datenquelle an. Als Bedingung geben wir den folgenden Ausdruck an:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_008.png\" alt=\"Datenmakro f&uuml;r das Pr&uuml;fen der L&ouml;schen-Berechtigung\" width=\"549,6265\" height=\"302,9439\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Datenmakro f&uuml;r das Pr&uuml;fen der L&ouml;schen-Berechtigung<\/span><\/b><\/p>\n<pre>[Tabelle]=''tblKunden'' Und [BerechtigungID]=8<\/pre>\n<p>Nun muss man wissen, dass man der Makroaktion <b>Datensatz nachschlagen in <\/b>weitere Makroaktionen unterordnen kann, die nur dann ausgef&uuml;hrt werden, wenn die Datensatzgruppe mindestens einen Datensatz enth&auml;lt. Das machen wir uns hier zunutze, indem wir f&uuml;r diesen Fall die Makroaktion <b>StoppMakro <\/b>einf&uuml;gen. Das sorgt daf&uuml;r, dass das Makro an dieser Stelle beendet wird &#8211; also genau dann, wenn die gew&uuml;nschte Berechtigung f&uuml;r die angegebene Tabelle vorhanden ist.<\/p>\n<p>Ist kein Datensatz vorhanden, wird <b>StoppMakro <\/b>nicht ausgef&uuml;hrt und das Datenmakro l&auml;uft hinter der Aktion <b>Datensatz nachschlagen in <\/b>einfach weiter. In diesem Fall wird dann die <b>Ausl&ouml;senFehler<\/b>-Aktion ausgef&uuml;hrt, welche die Meldung <b>L&ouml;schen nicht m&ouml;glich <\/b>anzeigt. Und durch den Aufruf der <b>Ausl&ouml;senFehler<\/b>-Makroaktion wird die das Makro ausl&ouml;sende Aktion, in diesem Fall also das L&ouml;schen des Datensatzes, nicht mehr abgeschlossen.<\/p>\n<h2>L&ouml;schen testen<\/h2>\n<p>Sie k&ouml;nnen dies nun ausprobieren, indem Sie sich einmal als ein Benutzer anmelden, der &uuml;ber mindestens eine Gruppe die Berechtigung zum L&ouml;schen von Daten in der Tabelle <b>tblKunden <\/b>besitzt und dann einen Datensatz aus der Tabelle <b>tblKunden <\/b>l&ouml;schen. Dies sollte problemlos m&ouml;glich sein &#8211; mit der Ausnahme von Datens&auml;tzen, f&uuml;r die bereits ein verkn&uuml;pfter Datensatz in der Tabelle <b>tblBestellungen <\/b>vorliegt. Dieser wird in der Beispieldatenbank aufgrund der referenziellen Integrit&auml;t nicht gel&ouml;scht. Wenn Sie sich dann als ein anderer Benutzer anmelden, der kein L&ouml;schen-Recht an dieser Tabelle besitzt oder einfach dem aktuellen Benutzer das L&ouml;schen-Recht entziehen, sollte beim Versuch, einen Datensatz aus der Tabelle <b>tblKunden <\/b>zu l&ouml;schen, eine entsprechende Meldung erscheinen.<\/p>\n<h2>&Auml;ndern und Anlegen mit Berechtigungen versehen<\/h2>\n<p>Auf die gleiche Weise k&uuml;mmern wir uns nun um die Berechtigungen zum Anlegen oder &Auml;ndern von Daten in der Tabelle <b>tblKunden<\/b>. Das Makro sieht wie in Bild 9 aus. Hier verwenden wir die bereits weiter oben vorgestellte <b>Wenn&#8230;Sonst<\/b>-Bedingung weiter, mit der wir gepr&uuml;ft haben, ob der Benutzer gerade einen vorhandenen oder einen neuen Datensatz &auml;ndern m&ouml;chte.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1193_009.png\" alt=\"Datenmakro f&uuml;r das Pr&uuml;fen der &Auml;ndern- und Anlegen-Berechtigung\" width=\"649,559\" height=\"629,1805\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Datenmakro f&uuml;r das Pr&uuml;fen der &Auml;ndern- und Anlegen-Berechtigung<\/span><\/b><\/p>\n<p>Im ersten Teil der Bedingung schlagen wir den Datensatz der Abfrage <b>qryTabellenberechtigungen <\/b>nach, der die Tabelle <b>tblKunden <\/b>im Feld <b>Tabelle <\/b>und den Wert <b>2 <\/b>im Feld <b>BerechtigungID <\/b>aufweist. Ist ein solcher Datensatz vorhanden, wird das Makro abgebrochen und der Datensatz kann angelegt werden. Falls nicht, wird die <b>Ausl&ouml;senFehler<\/b>-Aktion aufgerufen.<\/p>\n<p>Im zweiten Teil geschieht der gleiche Ablauf, nur dass dieser ausgel&ouml;st wird, wenn der Benutzer einen bestehenden Datensatz &auml;ndern m&ouml;chte. Dementsprechend pr&uuml;fen wir mit der Abfrage <b>qryTabellenberechtigungen<\/b>, ob es einen Datensatz gibt, der im Feld <b>Tabelle <\/b>den Wert <b>tblKunden <\/b>und im Feld <b>BerechtigungID <\/b>den Wert <b>4 <\/b>enth&auml;lt.<\/p>\n<h2>Anlegen der Makroaktionen f&uuml;r weitere Tabellen<\/h2>\n<p>Wenn wir diese Makroaktion f&uuml;r alle Tabellen der Datenbank anwenden wollen, haben wir je nach der Anzahl der Tabellen eine umfangreiche Aufgabe vor uns. Wir k&ouml;nnen zwar den Inhalt eines Makros mit Copy and Paste von einer Tabelle zur n&auml;chsten &uuml;bertragen, aber zus&auml;tzlich m&uuml;ssen wir auch noch in jedem Makro den Namen der Tabelle in der Bedingung f&uuml;r die Makroaktion <b>Datensatz nachschlagen in <\/b>anpassen.<\/p>\n<p>Wie also k&ouml;nnen wir dies vereinfachen Zum Gl&uuml;ck kennen wir ein paar Tricks, zum Beispiel die Methode <b>LoadFromText<\/b>, die ein Objekt aus einer Textdatei erzeugt. Das geht seit einigen Access-Versionen auch f&uuml;r Objekte mit der Konstanten <b>acTableDataMacro <\/b>als ersten Parameter. Und wir wissen, dass die Datenmakros schlicht und einfach XML-Dokumente sind. Wenn wir also unsere beiden bereits programmierten Datenmakros f&uuml;r die Tabelle <b>tblKunden <\/b>nehmen und diese per VBA so &auml;ndern, dass sie sich nicht mehr auf die Tabelle <b>tblKunden<\/b>, sondern auf die Tabelle <b>tblArtikel <\/b>und nicht mehr auf das Prim&auml;rschl&uuml;sselfeld <b>KundeID<\/b>, sondern <b>ArtikelID <\/b>beziehen, brauchen wir das XML-Dokument nur noch als Textdatei zu speichern und diese Textdatei mit der <b>LoadFromText<\/b>-Methode f&uuml;r eine andere Tabelle, hier <b>tblArtikel<\/b>, zur Datenbank hinzuzuf&uuml;gen. Der Aufruf der <b>LoadFromText<\/b>-Methode w&uuml;rde dann etwa so aussehen:<\/p>\n<pre>LoadFromText acTableDataMacro, \"tblArtikel\",  \"c:\tblArtikel.txt\"<\/pre>\n<p>Dies haben wir in der Prozedur aus Listing 2 realisiert. Die Prozedur erwartet zwei Parameter, n&auml;mlich den Namen der anzupassenden Tabelle sowie den Namen des Prim&auml;rschl&uuml;sselfeldes der Tabelle. Der folgende Aufruf f&uuml;gt beispielsweise die n&ouml;tigen Datenmakros zur Tabelle <b>tblArtikel <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatenmakrosZuTabelleHinzufuegen(strTabelle<span style=\"color:blue;\"> As String<\/span>, strPK<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strMakro<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span>\r\n     strMakro = strMakro & \"&lt;xml version=\"\"1.0\"\" encoding=\"\"UTF-16\"\" standalone=\"\"no\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"&lt;DataMacros xmlns=\"\"...\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"  &lt;DataMacro Event=\"\"BeforeChange\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"    &lt;Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"      &lt;ConditionalBlock&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"        &lt;If&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"          &lt;Condition&gt;IsNull([Old].[\" & strPK & \"])&lt;\/Condition&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"          &lt;Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"            &lt;LookUpRecord&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;Data Alias=\"\"dsTabellenberechtigungen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"                &lt;Reference&gt;qryTabellenberechtigungen&lt;\/Reference&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"                &lt;WhereCondition&gt;[Tabelle]=''\" & strTabelle & \"'' And [BerechtigungID]=2 &lt;\/WhereCondition&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;\/Data&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"                &lt;Action Name=\"\"StopMacro\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;\/Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"            &lt;\/LookUpRecord&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"            &lt;Action Name=\"\"RaiseError\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;Argument Name=\"\"Number\"\"&gt;2&lt;\/Argument&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;Argument Name=\"\"Description\"\"&gt;Anlegen nicht m&ouml;glich.&lt;\/Argument&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"            &lt;\/Action&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"          &lt;\/Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"        &lt;\/If&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"        &lt;Else&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"          &lt;Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"            &lt;LookUpRecord&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;Data Alias=\"\"dsTabellenberechtigungen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"                &lt;Reference&gt;qryTabellenberechtigungen&lt;\/Reference&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"                &lt;WhereCondition&gt;[Tabelle]=''\" & strTabelle _\r\n         & \"'' And [BerechtigungID]=4&lt;\/WhereCondition&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;\/Data&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"              &lt;Statements&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"                &lt;Action Name=\"\"StopMacro\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     ...\r\n     strMakro = strMakro & \"  &lt;\/DataMacro&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strMakro = strMakro & \"&lt;\/DataMacros&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strDateiname = CurrentProject.Path & \"\" & strTabelle & \".txt\"\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill strDateiname\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Open strDateiname For Append<span style=\"color:blue;\"> As <\/span>#1\r\n     Print #1, strMakro\r\n     Close #1\r\n     LoadFromText acTableDataMacro, strTabelle, strDateiname\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Hinzuf&uuml;gen der Datenmakros zu einer Tabelle <\/span><\/b><\/p>\n<pre>DatenmakrosZuTabelleHinzufuegen \"tblArtikel\", \"ArtikelID\"<\/pre>\n<p>Den ersten Parameter ben&ouml;tigt die Prozedur gleich an mehreren Stellen. Zun&auml;chst einmal wird dieser in der Bedingung der Makroaktion <b>Datensatz nachschlagen in <\/b>ben&ouml;tigt. Au&szlig;erdem ben&ouml;tigen wir diesen, um die Datenmakros mit der <b>LoadFromText<\/b>-Anweisung zur richtigen Tabelle hinzuzuf&uuml;gen. Den zweiten Parameter ben&ouml;tigen wir f&uuml;r die <b>Wenn<\/b>-Makroaktion im Datenmakro <b>Vor &Auml;nderung <\/b>an der Stelle, wo wir pr&uuml;fen, ob das Prim&auml;rschl&uuml;sselfeld des zu &auml;ndernden beziehungsweise anzulegenden Datensatzes leer ist.<\/p>\n<p>Den Tabellennamen und den Prim&auml;rschl&uuml;sselnamen f&uuml;gen wir beim Zusammensetzen des XML-Codes f&uuml;r die Datenmakros direkt in dem XML-Code ein. Am Ende erhalten wir so in der Variablen <b>strMakro <\/b>den Code f&uuml;r das komplette Datenmakro. Dieser ist im Listing aus Platzgr&uuml;nden gek&uuml;rzt.<\/p>\n<p>Der interessante Teil der Prozedur folgt nach dem Zusammensetzen des XML-Codes. Hier stellt die Prozedur zun&auml;chst einen Dateinamen f&uuml;r die zun&auml;chst zu erstellende Textdatei zusammen. Die Datei soll den Namen der Tabelle und die Endung <b>.txt <\/b>erhalten und im Verzeichnis der aktuellen Datenbank gespeichert werden. Dann l&ouml;scht die Prozedur eine eventuell vorhandene Datei gleichen Namens und erstellt die Datei dann mit der <b>Open<\/b>-Anweisung neu, um mit der <b>Print<\/b>-Anweisung den Inhalt der <b>String<\/b>-Variablen <b>strMakro <\/b>in die Datei zu schreiben. Diese wird dann mit der <b>Close<\/b>-Anweisung geschlossen. Schlie&szlig;lich liest die <b>LoadFromText<\/b>-Anweisung die Datei unter dem Typ <b>acTableDataMacro <\/b>f&uuml;r die mit dem zweiten Parameter angegebene Tabelle ein.<\/p>\n<p>Wenn Sie dies f&uuml;r alle in der Datenbank enthaltenen Tabellen erledigen wollen, k&ouml;nnen Sie eine Prozedur programmieren, die alle <b>TableDef<\/b>-Objekte durchl&auml;uft und die Prozedur <b>DatenmakrosZuTabelleHinzufuegen <\/b>f&uuml;r jede Tabelle einmal aufruft. Diese Prozedur k&ouml;nnte vereinfacht wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatenmakrosZuAllenTabellen()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Dim <\/span>strPK<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     For Each tdf In db.TableDefs\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Left<\/span>(tdf.Name, 4) = \"MSys\"<span style=\"color:blue;\"> Then<\/span>\r\n             strPK = tdf.Fields(0).Name\r\n             DatenmakrosZuTabelleHinzufuegen tdf.Name, strPK\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> tdf\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Vereinfacht deshalb, weil wir hier davon ausgehen, dass das erste Feld einer Tabelle auch das Prim&auml;rschl&uuml;sselfeld dieser Tabelle ist. Es gibt zuverl&auml;ssigere Methoden, den Namen des Prim&auml;rschl&uuml;sselfeldes zu ermitteln, aber f&uuml;r die meisten Tabellen funktioniert diese Prozedur. Wenn Sie diese Prozedur aufrufen, erhalten alle Tabellen die Datenmakros <b>Vor &Auml;nderung <\/b>und <b>Vor L&ouml;schung <\/b>mit angepassten Tabellen- und Prim&auml;rschl&uuml;sselnamen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie Sie das Anlegen, &Auml;ndern und L&ouml;schen von Datens&auml;tzen &uuml;ber Datenmakros entsprechend der angegebenen Berechtigungen einschr&auml;nken k&ouml;nnen.<\/p>\n<p>Um das System abzurunden, das die Beitr&auml;ge dieser Ausgabe erl&auml;utern, m&uuml;ssen wir noch einen Weg finden, die Tabellen vor dem Zugriff der Benutzer zu sch&uuml;tzen. Darum k&uuml;mmern wir uns in der n&auml;chsten Ausgabe von Access im Unternehmen unter dem Titel <b>Tabellen vor unerlaubtem Zugriff sch&uuml;tzen <\/b>(<b>www.access-im-unternehmen.de\/1196<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ZugriffsrechteMitDatenmakros.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/A95108C5-600A-4596-B365-440F67E0FC7C\/aiu_1193.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt verschiedene M&ouml;glichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die f&uuml;r ihn vorgesehenen Aktionen mit Daten durchf&uuml;hren darf &#8211; beispielsweise durch eine Pr&uuml;fung in den Ereignisprozeduren, die durch Ereignisse wie &#8222;Vor Aktualisierung&#8220; ausgel&ouml;st werden. Noch praktischer w&auml;re es allerdings, wenn diese Pr&uuml;fung nicht in jedem Formular programmiert werden m&uuml;sste, sondern anwendungsweit verf&uuml;gbar w&auml;re &#8211; also auch dann, wenn der Benutzer es schafft, ohne Formulare auf die Tabellen mit den Daten zuzugreifen. Das gelingt mit Datenmakros. Wie genau, zeigt der vorliegende Beitrag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662019,66032019,44000038],"tags":[],"class_list":["post-55001193","post","type-post","status-publish","format-standard","hentry","category-662019","category-66032019","category-Sicherheit"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Zugriffsrechte mit Datenmakros - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zugriffsrechte mit Datenmakros\" \/>\n<meta property=\"og:description\" content=\"Es gibt verschiedene M&ouml;glichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die f&uuml;r ihn vorgesehenen Aktionen mit Daten durchf&uuml;hren darf - beispielsweise durch eine Pr&uuml;fung in den Ereignisprozeduren, die durch Ereignisse wie &quot;Vor Aktualisierung&quot; ausgel&ouml;st werden. Noch praktischer w&auml;re es allerdings, wenn diese Pr&uuml;fung nicht in jedem Formular programmiert werden m&uuml;sste, sondern anwendungsweit verf&uuml;gbar w&auml;re - also auch dann, wenn der Benutzer es schafft, ohne Formulare auf die Tabellen mit den Daten zuzugreifen. Das gelingt mit Datenmakros. Wie genau, zeigt der vorliegende Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T20:55:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Zugriffsrechte mit Datenmakros\",\"datePublished\":\"2020-05-13T20:55:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/\"},\"wordCount\":2647,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/3ec6f9e246154851946b94534f214b4e\",\"articleSection\":[\"2019\",\"3\\\/2019\",\"Sicherheit\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/\",\"name\":\"Zugriffsrechte mit Datenmakros - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/3ec6f9e246154851946b94534f214b4e\",\"datePublished\":\"2020-05-13T20:55:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/3ec6f9e246154851946b94534f214b4e\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/3ec6f9e246154851946b94534f214b4e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zugriffsrechte_mit_Datenmakros\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zugriffsrechte mit Datenmakros\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zugriffsrechte mit Datenmakros - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/","og_locale":"de_DE","og_type":"article","og_title":"Zugriffsrechte mit Datenmakros","og_description":"Es gibt verschiedene M&ouml;glichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die f&uuml;r ihn vorgesehenen Aktionen mit Daten durchf&uuml;hren darf - beispielsweise durch eine Pr&uuml;fung in den Ereignisprozeduren, die durch Ereignisse wie \"Vor Aktualisierung\" ausgel&ouml;st werden. Noch praktischer w&auml;re es allerdings, wenn diese Pr&uuml;fung nicht in jedem Formular programmiert werden m&uuml;sste, sondern anwendungsweit verf&uuml;gbar w&auml;re - also auch dann, wenn der Benutzer es schafft, ohne Formulare auf die Tabellen mit den Daten zuzugreifen. Das gelingt mit Datenmakros. Wie genau, zeigt der vorliegende Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T20:55:06+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Zugriffsrechte mit Datenmakros","datePublished":"2020-05-13T20:55:06+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/"},"wordCount":2647,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e","articleSection":["2019","3\/2019","Sicherheit"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/","url":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/","name":"Zugriffsrechte mit Datenmakros - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e","datePublished":"2020-05-13T20:55:06+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/3ec6f9e246154851946b94534f214b4e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Zugriffsrechte_mit_Datenmakros\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Zugriffsrechte mit Datenmakros"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001193"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001193\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}