{"id":55001156,"date":"2018-10-01T00:00:00","date_gmt":"2020-05-13T21:12:25","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1156"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"SQL_ServerZugriff_ohne_gespeichertes_Kennwort","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/","title":{"rendered":"SQL Server-Zugriff ohne gespeichertes Kennwort"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie per ODBC auf die Tabellen etwa eines SQL Servers zugreifen, kennen Sie das Dilemma: Entweder Sie nutzen die Windows-Authentifizierung, was nicht &uuml;berall m&ouml;glich ist, aber ohne gr&ouml;&szlig;ere Probleme funktioniert. Oder Sie verwenden die SQL Server-Authentifizierung. Dann haben Sie zwei M&ouml;glichkeiten: Entweder Sie erlauben das Speichern des Kennworts in den Systemtabellen von Access. Oder der Benutzer muss nach dem eigentlichen Anmelden nochmal seine Benutzerdaten eingeben, wenn der erste Zugriff auf eine Tabelle erfolgt. In dieser L&ouml;sung schauen wir uns diese Varianten an &#8211; und eine bessere, bei der Sie einfach die Tabellen beim Start neu verkn&uuml;pfen.<\/b><\/p>\n<p>Wir gehen an dieser Stelle davon aus, dass Sie einen SQL Server auf dem Rechner installiert haben und dort eine Datenbank mit einer oder mehreren gew&uuml;nschten Tabellen mit Zugriffsrechten f&uuml;r ein bestimmtes Konto eingerichtet haben. Wichtig ist letzteres &#8211; sonst k&ouml;nnen Sie ja nicht per SQL Server-Authentifizierung auf die Tabelle zugreifen.<\/p>\n<h2>Verkn&uuml;pfung per Assistent<\/h2>\n<p>Der g&auml;ngige Weg, eine Verkn&uuml;pfung zu einer SQL Server-Tabelle herzustellen, ist der &uuml;ber den Assistenten. Dabei rufen Sie diesen &uuml;ber den Ribbon-Eintrag <b>Externe Daten|Importieren und Verkn&uuml;pfen|Neue Datenquelle|Aus Datenbank|Aus SQL Server <\/b>auf (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_001.png\" alt=\"Manuelles Verkn&uuml;pfen mit einer SQL Server-Tabelle\" width=\"424,7115\" height=\"385,2259\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Manuelles Verkn&uuml;pfen mit einer SQL Server-Tabelle<\/span><\/b><\/p>\n<p>Dies &ouml;ffnet den Dialog aus Bild 2, wo Sie die zweite Option zum Erstellen einer Verkn&uuml;pfung ausw&auml;hlen und dann auf <b>OK <\/b>klicken.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_002.png\" alt=\"Start der Erstellung einer Verkn&uuml;pfung\" width=\"649,559\" height=\"293,8901\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Start der Erstellung einer Verkn&uuml;pfung<\/span><\/b><\/p>\n<p>Der n&auml;chste Dialog hei&szlig;t Datenquelle ausw&auml;hlen und hat zwei Registerreiter.<\/p>\n<p>Wir w&auml;hlen den zweiten namens <b>Computerdatenquelle <\/b>an und klicken dort auf die Schaltfl&auml;che <b>Neu&#8230; <\/b>(siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_003.png\" alt=\"Anlegen einer neuen Computerdatenquelle\" width=\"424,7115\" height=\"376,9911\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen einer neuen Computerdatenquelle<\/span><\/b><\/p>\n<p>Einen Schritt weiter legen Sie noch genau fest, ob Sie eine Benutzerdatenquelle oder eine Systemdatenquelle anlegen wollen &#8211; wir w&auml;hlen die Benutzerdatenquelle (siehe Bild 4). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_004.png\" alt=\"Auswahl des Datenquellentyps\" width=\"424,7115\" height=\"322,195\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Auswahl des Datenquellentyps<\/span><\/b><\/p>\n<p>Der folgende Schritt fragt ab, welchen Datenbanktreiber wir verwenden wollen. Mit dem Treiber <b>SQL Server <\/b>macht man nichts verkehrt (siehe Bild 5). <b>Die SQL Server Native Client x.0<\/b>-Treiber k&ouml;nnen Sie verwenden, wenn diese spezielle Features f&uuml;r den Zugriff auf die jeweilige Version des SQL Servers bereithalten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_005.png\" alt=\"Auswahl des Datenbanktreibers\" width=\"424,7115\" height=\"322,195\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Auswahl des Datenbanktreibers<\/span><\/b><\/p>\n<p>Der n&auml;chste Schritt ermittelt einen Namen f&uuml;r die Datenquelle. Diese nennen wir einfach <b>Datenquelle_Suedsturm_SQL<\/b>. Au&szlig;erdem m&ouml;chte der Assistent hier wissen, auf welchen SQL Server wir zugreifen wollen, um die Verkn&uuml;pfung herzustellen. Diese hei&szlig;t in unserem Fall wie der Rechner, auf dem der SQL Server l&auml;uft. Wenn Sie die LocalDb-Version nutzen, w&uuml;rden Sie hier beispielsweise <b>(localdb)\\SQLServerLocalDB <\/b>angeben (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_006.png\" alt=\"Angeben eines Namens f&uuml;r die Datenquelle und des Servers\" width=\"424,7115\" height=\"303,845\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Angeben eines Namens f&uuml;r die Datenquelle und des Servers<\/span><\/b><\/p>\n<p>Ist dieser Schritt erledigt, fragt der Assistent im n&auml;chsten Schritt ab, ob wir Windows-Authentifizierung oder SQL Server-Authentifizierung verwenden wollen. Wir entscheiden uns f&uuml;r letzteres und tragen unsere Benutzerdaten in die beiden nun freigeschalteten Textfelder <b>Login ID <\/b>und <b>Password <\/b>ein (siehe Bild 7). Der Benutzer hei&szlig;t hier <b>Benutzer3<\/b>, das Kennwort <b>password<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_007.png\" alt=\"Einstellen der SQL Server-Authentifizierung und Angabe der Zugangsdaten\" width=\"424,7115\" height=\"386,5463\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Einstellen der SQL Server-Authentifizierung und Angabe der Zugangsdaten<\/span><\/b><\/p>\n<p>Wie Sie einen Benutzer f&uuml;r die SQL Server-Authentifizierung f&uuml;r eine Datenbank anlegen, hier <b>Benutzer3<\/b>, erfahren Sie im Beitrag <b>SQL Server-Authentifizierung <\/b>(<b>www.access-im-unternehmen.de\/1155<\/b>).<\/p>\n<p>Im folgenden Schritt k&ouml;nnen Sie noch die Standarddatenbank auf <b>Suedsturm_SQL <\/b>einstellen (siehe Bild 8), die Einstellungen im darauffolgenden Dialog behalten wir bei.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_009.png\" alt=\"Einstellen der Standarddatenbank\" width=\"424,7115\" height=\"382,1436\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Einstellen der Standarddatenbank<\/span><\/b><\/p>\n<p>Es folgt ein Abschlussdialog, der die Einstellungen nochmal zusammenfasst und eine Schaltfl&auml;che anbietet, mit der Sie die Datenquelle testen k&ouml;nnen (<b>Test Data Source&#8230;<\/b>). Diese klicken Sie an und sollten dann das Ergebnis aus Bild 9 erhalten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0010.png\" alt=\"Testen der Datenbankverbindung\" width=\"649,559\" height=\"413,8868\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Testen der Datenbankverbindung<\/span><\/b><\/p>\n<p>Damit ist die Computerdatenquelle angelegt und wir finden diese im Dialog <b>Datenquelle ausw&auml;hlen <\/b>vor. Die neue Datenquelle sollte nun ausgew&auml;hlt sein und wir schlie&szlig;en den Dialog mit der <b>OK<\/b>-Schaltfl&auml;che.<\/p>\n<p>Nun erscheint ein Dialog namens <b>SQL Server Login<\/b>. Hier ist der Benutzername bereits voreingestellt und wir m&uuml;ssen noch das Kennwort eingeben (siehe Bild 10). Mit einem Klick auf die Schaltfl&auml;che <b>Optionen >> <\/b>k&ouml;nnen Sie noch weitere Optionen einblenden &#8211; etwa, um das Kennwort zu &auml;ndern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0011.png\" alt=\"Herstellen der Verbindung\" width=\"424,7115\" height=\"454,6705\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Herstellen der Verbindung<\/span><\/b><\/p>\n<p>Im abschlie&szlig;enden Dialog <b>Tabellen verkn&uuml;pfen <\/b>k&ouml;nnen Sie nun die zu verkn&uuml;pfenden Tabellen ausw&auml;hlen (siehe Bild 11). Wir w&auml;hlen alle Tabellen aus, die wir selbst angelegt haben &#8211; die anderen sind Systemtabellen der SQL Server-Datenbank.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0012.png\" alt=\"Auswahl der zu verkn&uuml;pfenden Tabellen\" width=\"424,7115\" height=\"389,3907\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Auswahl der zu verkn&uuml;pfenden Tabellen<\/span><\/b><\/p>\n<p>Direkt im Anschluss erscheinen die ausgew&auml;hlten Tabellen im Navigationsbereich von Access &#8211; allerdings jeweils mit dem Pr&auml;fix <b>dbo_<\/b> (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0014.png\" alt=\"Die frisch angelegten Verkn&uuml;pfungen\" width=\"424,7115\" height=\"334,748\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Die frisch angelegten Verkn&uuml;pfungen<\/span><\/b><\/p>\n<h2>Ver-bin-dungs-zeichen-folgen ansehen<\/h2>\n<p>Nun &ouml;ffnen wir die Systemtabelle MSysObjects von Access und schauen uns den Inhalt der Spalte Connect an. Diese liefert uns die Verbindungszeichenfolge, die der Verkn&uuml;pfungsassistent eingerichtet hat (siehe Bild 13). Wir sehen hier eine Verbindungszeichenfolge mit einer <b>DSN <\/b>namens <b>Test <\/b>sowie die Angabe einer <b>APP <\/b>und der <b>DATABASE<\/b>:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0013.png\" alt=\"Die Tabelle MSysObjects mit den Verbindungszeichenfolgen\" width=\"649,559\" height=\"219,2635\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Die Tabelle MSysObjects mit den Verbindungszeichenfolgen<\/span><\/b><\/p>\n<pre>DSN=Test;APP=Microsoft Office 2016;DATABASE=Suedsturm_SQL;<\/pre>\n<p>Die hinter der DSN steckenden Informationen finden wir in der Registry unter dem Zweig <b>HKEY_CURRENT_USER\\Software\\ODBC\\ODBC.INI\\Test <\/b>&#8211; siehe Bild 14. Hier wird nur der zuletzt verwendete Benutzername gespeichert, aber nicht das Kennworts.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0015.png\" alt=\"Die DSN in der Systemregistrierung\" width=\"649,559\" height=\"291,8845\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Die DSN in der Systemregistrierung<\/span><\/b><\/p>\n<p>Das Kennwort wurde in fr&uuml;heren Versionen noch optional gespeichert, aber aus Sicherheitsgr&uuml;nden hat Microsoft diese Option entfernt.<\/p>\n<h2>Zugriff auf die Tabellen<\/h2>\n<p>Die Tabellen k&ouml;nnen Sie nun direkt &ouml;ffnen &#8211; Sie brauchen nicht erneut die Zugangsdaten einzugeben. Wenn Sie die Access-Sitzung allerdings beenden und erneut starten (dies erfordert das Schlie&szlig;en der Access-Anwendung &#8211; das Schlie&szlig;en der Datenbank allein reicht nicht aus), erscheint beim ersten Zugriff auf eine der Tabellen der Dialog zum Eingeben der Zugriffsdaten (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0016.png\" alt=\"SQL Server-Logindialog\" width=\"424,7115\" height=\"167,4174\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: SQL Server-Logindialog<\/span><\/b><\/p>\n<p>Die L&ouml;sung ist zwar sicher, aber wenig komfortabel &#8211; f&uuml;r den Benutzer ist es aber nicht die perfekte L&ouml;sung. Das Problem ist, dass wir ihn nicht mit dem von Microsoft vorgegebenen, englischsprachigen Dialog abspeisen wollen.<\/p>\n<p>Au&szlig;erdem soll die Eingabe des Kennworts nicht erst beim erstmaligen Zugriff auf eine der Tabellen erfolgen, sondern direkt beim Start.<\/p>\n<h2>Kennwort in der Verbindungszeichenfolge speichern<\/h2>\n<p>Eine f&uuml;r den Benutzer ergonomische, aber bez&uuml;glich der Datensicherheit bedenkliche L&ouml;sung w&auml;re es, das Kennwort in der Verbindungszeichenfolge zu speichern. Sollte ein anderer Benutzer Zugriff auf den Rechner erhalten k&ouml;nnte er die Zugangsdaten direkt aus der Tabelle <b>MSys-Objects <\/b>oder auch aus den Eigenschaften der Entwurfsansicht einer der verkn&uuml;pften Tabellen auslesen. Also lassen wir diesen Ansatz gleich unter den Tisch fallen.<\/p>\n<h2>Verkn&uuml;pfen und l&ouml;schen<\/h2>\n<p>Der aus unserer Sicht beste Ansatz ist es, die Zugangsdaten in einem benutzerdefinierten Dialog beim Starten der Anwendung abzufragen und die Verkn&uuml;pfungen dann zu erstellen. Dabei verwendet man eine bestimmte Option, die daf&uuml;r sorgt, dass die Benutzerdaten nicht in der Verbindungszeichenfolge in der Systemtabelle <b>MSysObjects<\/b> gespeichert werden. Die Zugangsdaten werden dann durch eine per Code realisierte Anmeldung f&uuml;r diese Sitzung gespeichert. Wenn der Benutzer dann das n&auml;chste Mal auf die Datenbank zugreift, m&uuml;sste er die Zugangsdaten neu eingeben, sobald er auf eine der Tabellen zugreift. Dann w&uuml;rde der eingebaute Dialog zum Eingeben der Anmeldedaten erscheinen. Um das zu verhindern, sorgen wir dauerhaft daf&uuml;r, dass der Benutzer immer beim Neustart der Anwendung die Benutzerdaten eingeben muss. Wie das gelingt, zeigen wir in den folgenden Abschnitten.<\/p>\n<h2>Tabellen beim Start verkn&uuml;pfen <\/h2>\n<p><!--30percent--><\/p>\n<p>Um die Tabellen beim Start der Anwendung zu verkn&uuml;pfen, ben&ouml;tigen wir ein Formular, das beim Start der Anwendung ge&ouml;ffnet wird und die Anmeldedaten abfragt. Dann soll das Formular mit diesen Anmeldedaten eine Verbindungszeichenfolge zusammenstellen und die ODBC-Verkn&uuml;pfungen zu den ben&ouml;tigten Tabellen herstellen.<\/p>\n<p>Dadurch, dass die Zugangsdaten nicht in der Tabelle <b>MSysObjects <\/b>gespeichert werden, kann selbst eine Person, die in Abwesenheit des Benutzers auf die Datenbank zugreift, nicht die Zugangsdaten ermitteln. Allerdings w&auml;re es f&uuml;r diese Person auch ohne Vorhandensein der Anmeldedaten m&ouml;glich, in diesem Moment &uuml;ber die Anwendung auf die Datenin der SQL Server-Datenbank zuzugreifen &#8211; man sollte sich grunds&auml;tzlich von seinem Rechner abmelden, wenn man den Raum verl&auml;sst und Unbefugte in der N&auml;he sein k&ouml;nnten.<\/p>\n<h2>Login-Formular programmieren<\/h2>\n<p>Das Login-Formular soll die folgenden Steuer-elemente enthalten:<\/p>\n<ul>\n<li><b>txtBenutzername<\/b>: Nimmt den Benutzernamen auf.<\/li>\n<li><b>txtKennwort<\/b>: Nimmt das Kennwort auf. Als Eingabeformat verwenden wir Kennwort, damit dieses maskiert angezeigt wird.<\/li>\n<li><b>cmdAnmelden<\/b>: Schaltfl&auml;che zum Herstellen der Verkn&uuml;fungen zu den Tabellen des SQL Servers<\/li>\n<li><b>cmdAbbrechen<\/b>: Schaltfl&auml;chen zum Abbrechen des Logins<\/li>\n<\/ul>\n<p>Das Formular stellen wir etwa wie in Bild 16 zusammen. F&uuml;r das Steuer-element <b>cmdAnmelden <\/b>legen wir die Eigenschaft <b>Standard <\/b>auf den Wert <b>Ja <\/b>fest, f&uuml;r das Steuer-element <b>cmdAbbrechen <\/b>die Eigenschaft <b>Abbrechen <\/b>auf den Wert <b>Ja<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0017.png\" alt=\"Entwurf des Login-Formulars\" width=\"549,6265\" height=\"299,638\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Entwurf des Login-Formulars<\/span><\/b><\/p>\n<p>Damit die durch die Schaltfl&auml;che <b>cmdAnmelden <\/b>ausgel&ouml;ste Ereignisprozedur wei&szlig;, welche Tabellen verkn&uuml;pft werden sollen, legen wir noch eine Tabelle namens <b>tblVerknuepfungen <\/b>an. Diese enth&auml;lt drei Felder: <b>VerknuepfungID<\/b>, <b>Quelltabelle <\/b>und <b>Zieltabelle<\/b>.<\/p>\n<p>Quelltabelle und Zieltabelle deshalb, weil es ja sein kann, dass Sie die Verkn&uuml;pfungen nicht unter dem Namen anlegen wollen, unter dem die Tabellen im SQL Server gespeichert sind. Den Entwurf dieser Tabelle finden Sie in Bild 17.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0018.png\" alt=\"Entwurf der Tabelle zum Speichern der zu verkn&uuml;pfenden Tabellen\" width=\"499,6607\" height=\"350,7492\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Entwurf der Tabelle zum Speichern der zu verkn&uuml;pfenden Tabellen<\/span><\/b><\/p>\n<h2>Automatisches F&uuml;llen der Tabelle<\/h2>\n<p>Wenn Sie keine Lust haben, die zu verkn&uuml;pfenden Tabellen manuell in die Tabelle <b>tblVerknuepfungen <\/b>einzutragen, k&ouml;nnen Sie das auch mit einer kleinen Prozedur erledigen. Voraussetzung daf&uuml;r ist, dass Sie &#8211; wie beispielsweise durch die zuvor beschriebene Vorgehensweise &#8211; die Verkn&uuml;pfungen bereits einmal angelegt haben.<\/p>\n<p>In diesem Fall k&ouml;nnen Sie die Prozedur <b>AktuelleVerknuepfungenSpeichern<\/b> aufrufen, die Sie in Listing 1 finden. Die Prozedur durchl&auml;uft alle Tabellen der Datenbank &uuml;ber die <b>TableDefs<\/b>-Auflistung des <b>Database<\/b>-Objekts. In der <b>For Each<\/b>-Schleife pr&uuml;ft die Prozedur zun&auml;chst, ob die Eigenschaft <b>Connect <\/b>eine Zeichenl&auml;nge mit einer Gr&ouml;&szlig;e gr&ouml;&szlig;er <b>0 <\/b>enth&auml;lt. Dies deutet darauf hin, dass es sich um eine verkn&uuml;pfte Tabelle handelt. Ist dies der Fall, ermittelt die Prozedur den Namen der Quelltabelle und der Zieltabelle und schreibt diese in die beiden Variablen <b>strQuelltabelle <\/b>und <b>strZieltabelle<\/b>. Von dort landen sie dann innerhalb einer <b>INSERT INTO<\/b>-Aktionsabfrage in der Tabelle <b>tblVerknuepfungen<\/b>. Nachdem wir diese Prozedur f&uuml;r die Tabellen unserer Beispieldatenbank durchlaufen haben, sieht die Tabelle <b>tblVerknuepfungen <\/b>etwa wie in Bild 18 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0019.png\" alt=\"Tabelle mit den Quell- und Zieldateien f&uuml;r das Wiederherstellen der Verkn&uuml;pfungen\" width=\"299,7964\" height=\"197,0493\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Tabelle mit den Quell- und Zieldateien f&uuml;r das Wiederherstellen der Verkn&uuml;pfungen<\/span><\/b><\/p>\n<p>Wir haben hier schon das Pr&auml;fix <b>dbo_ <\/b>von den Namen der Verkn&uuml;pfungen entfernt.<\/p>\n<h2>Die Optionen-Tabelle<\/h2>\n<p>Neben der Tabelle zum Speichern der Verkn&uuml;pfungen legen wir noch eine weitere Hilfstabelle namens <b>tblOptionen <\/b>an.<\/p>\n<p>Diese enth&auml;lt lediglich das Prim&auml;rschl&uuml;sselfeld <b>OptionID <\/b>sowie die beiden Felder <b>Bezeichnung <\/b>und <b>Wert<\/b>. Hier speichern wir in zwei Datens&auml;tzen die Bezeichnungen f&uuml;r den Server und die Datenbank, auf die wir per ODBC zugreifen wollen (siehe Bild 19).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0020.png\" alt=\"Tabelle mit Optionen\" width=\"299,7964\" height=\"106,3317\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Tabelle mit Optionen<\/span><\/b><\/p>\n<h2>Verknuepfungen anlegen per Startformular<\/h2>\n<p>Den Start beim Neuanlegen der Verkn&uuml;pfungen machen wir im Startformular. Dieses sieht wie in Bild 20 aus und entspricht dem Startformular der Beispieldatenbank. Hier haben wir f&uuml;r das gr&uuml;ne Bild mit dem Haken-Symbol eine Ereignisprozedur hinterlegt, die wie in Listing 2 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0021.png\" alt=\"Das Startformular der Anwendung\" width=\"299,7964\" height=\"149,4897\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Das Startformular der Anwendung<\/span><\/b><\/p>\n<p>Die Prozedur &ouml;ffnet zun&auml;chst unser Formular <b>frmLogin <\/b>und wartet ab, bis der Benutzer entweder die <b>OK<\/b>-Schaltfl&auml;che oder die <b>Abbrechen<\/b>-Schaltfl&auml;che gedr&uuml;ckt hat und damit entweder das Formular unsichtbar gemacht oder geschlossen hat.<\/p>\n<p>Erst dann wird die Prozedur <b>cmdGo_Click <\/b>fortgesetzt. Sie pr&uuml;ft dann mit der Hilfsfunktion <b>IstFormularGeoeffnet<\/b>, ob das Formular <b>frmLogin <\/b>noch ge&ouml;ffnet ist, was der Fall ist, wenn der Benutzer es mit der Schaltfl&auml;che <b>cmdOK <\/b>ausgeblendet hat.<\/p>\n<p>In diesem Fall k&ouml;nnen wir den Benutzernamen und das Kennwort aus den beiden Textfeldern des Formulars in die im Modul <b>mdlSQLServer <\/b>global deklarierten Variablen eintragen.<\/p>\n<p>Danach wird das Formular <b>frmLogin <\/b>geschlossen und die Prozedur liest die Werte f&uuml;r den Server und die Datenbank aus der Tabelle <b>tblOptionen <\/b>ein.<\/p>\n<p>Damit setzt sie die Verbindungszeichenfolge zusammen, die danach etwa wie folgt aussieht:<\/p>\n<pre>DBC;DRIVER={SQL Server};SERVER=Desktop-PC-I5;DATABASE=Suedsturm_SQL;UID=Benutzer3;PWD=password;OPTION=3;LOG_QUERY=1;<\/pre>\n<p>Damit als Parameter ruft die Prozedur nun die Funktion <b>VerbindungTesten<\/b>. Testet diese die Verbindung erfolgreich und gibt den Wert <b>True <\/b>zur&uuml;ck, geht es mit dem Aufruf der Funktion TabellenVerknuepfen weiter.<\/p>\n<p>Diese erwartet wiederum die Verbindungszeichenfolge als Parameter und ruft die Prozedur <b>TabellenVerknuepfen <\/b>auf, welche die Verkn&uuml;pfung mit den Tabellen erledigt.<\/p>\n<h2>Verbindung testen<\/h2>\n<p>Das Testen der Verbindung &uuml;bernimmt die Funktion <b>VerbindungHerstellen<\/b>, die wiederum die Verbindungszeichenfolge als Parameter erwartet (siehe Listing 3). Sie erstellt mit der Methode <b>CreateQueryDef <\/b>eine leere Abfrage.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungHerstellen(strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database, qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(\"\")\r\n     <span style=\"color:blue;\">With<\/span> qdf\r\n         .Connect = strVerbindungszeichenfolge\r\n         .ReturnsRecords = <span style=\"color:blue;\">True<\/span>\r\n         .SQL = \"SELECT 1 AS Test\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         .OpenRecordset\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n             VerbindungHerstellen = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Herstellen der Verbindung mit der SQL Server-Datenbank<\/span><\/b><\/p>\n<p>Dieser weist sie &uuml;ber die Eigenschaft <b>Connect <\/b>die Verbindungszeichenfolge zu. Au&szlig;erdem stellt sie die Eigenschaft <b>ReturnRecords <\/b>auf den Wert <b>True <\/b>ein und legt f&uuml;r die Eigenschaft <b>SQL <\/b>eine einfache <b>SELECT<\/b>-Abfrage an (<b>SELECT 1 AS Test<\/b>). Dann versucht sie, bei deaktivierter Fehlerbehandlung die Abfrage mit der Methode <b>OpenRecordset <\/b>zu &ouml;ffnen. Wenn dies gelingt, hat <b>Err.Number <\/b>anschlie&szlig;end noch den Wert <b>0 <\/b>und der R&uuml;ckgabewert der Funktion erh&auml;lt den Wert <b>True<\/b>.<\/p>\n<h2>Tabellen verkn&uuml;pfen<\/h2>\n<p>Die Funktion <b>TabellenVerknuepfen <\/b>erwartet wiederum die Verbindungszeichenfolge als Parameter (siehe Listing 4). Sie &ouml;ffnet ein Recordset auf Basis der Tabelle <b>tblVerknuepfungen <\/b>und durchl&auml;uft die Datens&auml;tze dieses Recordsets in einer <b>Do While<\/b>-Schleife. Dabei ruft es f&uuml;r jeden Datensatz einmal die Prozedur <b>TabelleVerknuepfen <\/b>auf.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TabellenVerknuepfen(strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblVerknuepfungen\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         TabelleVerknuepfen rst!Zieltabelle, rst!Quelltabelle, strVerbindungszeichenfolge\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Verkn&uuml;pfen der Tabellen<\/span><\/b><\/p>\n<h2>Tabelle verkn&uuml;pfen<\/h2>\n<p>Diese Prozedur (siehe Listing 5) erwartet nicht nur die Verbindungszeichenfolge, sondern auch noch den Namen der Tabelle in der SQL Server-Datenbank und die Bezeichnung, welche die Verkn&uuml;pfung in der Access-Datenbank erhalten soll. Sie referenziert zun&auml;chst die mit <b>strTabelleAccess <\/b>angegebene Verkn&uuml;pfung in Access als <b>TableDef<\/b>-Objekt. Hat die Objektvariable <b>tdf <\/b>danach nicht den Wert <b>Nothing<\/b>, ist offensichtlich bereits eine Verkn&uuml;pfung oder Tabelle gleichen Namens vorhanden. Sollte es bei dem bereits vorhandenen Element gleichen Namens um eine Verkn&uuml;pfung handeln, wird diese einfach gel&ouml;scht. Anderenfalls handelt es sich um eine lokale Tabelle, bei der wir den Benutzer fragen sollten, ob wir diese Tabelle l&ouml;schen k&ouml;nnen. Das erledigen wir per <b>MsgBox<\/b>-Anweisung. Liefert diese den Wert <b>vbYes<\/b>, l&ouml;schen wir die Tabelle ebenfalls einfach. Anderenfalls speichern wir die zu erzeugende Verkn&uuml;pfung einfach unter einem Namen, der dem Namen aus <b>strTabelleAccess <\/b>und dem Zusatz <b>1 <\/b>entspricht, also beispielsweise <b>tblArtikel1<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TabelleVerknuepfen(strTabelleAccess<span style=\"color:blue;\"> As String<\/span>, ByVal strTabelleSQLServer<span style=\"color:blue;\"> As String<\/span>, _\r\n         strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)\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>TableDef\r\n     <span style=\"color:blue;\">Dim <\/span>bolVorhanden<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(strTabelleAccess)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> tdf Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(tdf.Connect) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             If <span style=\"color:blue;\">MsgBox<\/span>(\"Es ist bereits eine lokale Tabelle namens ''''\" & strTabelleAccess & \"'''' gespeichert. \" _\r\n                     & \"&uuml;berschreiben (Ja) oder zu verkn&uuml;pfende Tabelle umbenennen (Nein)\", vbYesNo) = vbYes Then\r\n                 db.TableDefs.Delete strTabelleAccess\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 db.TableDefs.Delete strTabelleAccess & \"1\"\r\n                 strTabelleAccess = strTabelleAccess & \"1\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             db.TableDefs.Delete strTabelleAccess\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> tdf = Nothing\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> tdf = db.CreateTableDef(strTabelleAccess)\r\n     tdf.Connect = strVerbindungszeichenfolge\r\n     tdf.SourceTableName = strTabelleSQLServer\r\n     db.TableDefs.Append tdf\r\n     SysCmd acSysCmdSetStatus, \"Tabelle ''''\" & strTabelleSQLServer & \"'''' verkn&uuml;pfen ...\"\r\n     DoEvents\r\n     Application.RefreshDatabaseWindow\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Prozedur zum Verkn&uuml;pfen einer Tabelle<\/span><\/b><\/p>\n<p>Anschlie&szlig;end leeren wir das Objekt <b>tdf <\/b>und f&uuml;llen es mit der zu erstellenden Tabelle. Diese legen wir mit der <b>CreateTableDef<\/b>-Methode an, der wir als Parameter den Namen der Verkn&uuml;pfung aus <b>strTabelleAccess <\/b>&uuml;bergeben. Dann weisen wir der Eigenschaft <b>Connect <\/b>den Inhalt der Variablen <b>strVerbindungszeichenfolge <\/b>zu. Diese enth&auml;lt zu diesem Zeitpunkt den Benutzernamen und das Kennwort und sieht etwa wie folgt aus:<\/p>\n<pre>ODBC;DRIVER={SQL Server};SERVER=Desktop-PC-I5;DATABASE=Suedsturm_SQL;UID=Benutzer3;PWD=password;OPTION=3;LOG_QUERY=1;<\/pre>\n<p>Danach stellen wir noch den Namen der Quelltabelle, also der Tabelle des SQL Servers, auf den Wert aus <b>strTabelleSQLServer <\/b>ein. Zu diesem Zeitpunkt ist die Verkn&uuml;pfung zwar in Form eines <b>TableDef<\/b>-Objekts existent, aber noch nicht zur Auflistung der <b>TableDefs <\/b>der aktuellen Datenbank hinzugef&uuml;gt. Das holen wir dann mit der <b>Append<\/b>-Methode der <b>TableDefs<\/b>-Auflistung nach. Danach folgt noch ein Aufruf der <b>SysCmd<\/b>-Funktion, die den Fortschritt in der Statusleiste von Access anzeigt.<\/p>\n<p>Die <b>DoEvents<\/b>-Anweisung sorgt daf&uuml;r, dass diese zuverl&auml;ssig aktualisiert wird. Schlie&szlig;lich sollen die neu erstellten Verkn&uuml;pfungen auch noch im Navigationsbereich dargestellt werden &#8211; dazu rufen wir die Methode <b>RefreshDatabaseWindow <\/b>des <b>Application<\/b>-Objekts auf.<\/p>\n<p>Damit sind die Arbeiten f&uuml;r den Login und f&uuml;r das Erstellen der Verkn&uuml;pfungen abgeschlossen.<\/p>\n<h2>Test der Verkn&uuml;pfung<\/h2>\n<p>Um die Neu-Verkn&uuml;pfung zu testen, l&ouml;schen wir nun zun&auml;chst die bestehenden Verkn&uuml;pfungen aus der Datenbank und schlie&szlig;en diese und auch Access selbst. Das Formular <b>frmIntro <\/b>wird automatisch aufgerufen, da es f&uuml;r die Eigenschaft Startformular in den Access-Optionen eingesetzt wurde. Wenn der Benutzer die Schaltfl&auml;che <b>cmdGo<\/b> anklickt, wird die weiter oben beschriebene Prozedur ausgel&ouml;st und zeigt den Dialog <b>frmLogin <\/b>an.<\/p>\n<p>Gibt der Benutzer hier die korrekten Zugangsdaten ein, hier also <b>Benutzer3 <\/b>und <b>password<\/b>, werden eventuell bestehende Verkn&uuml;pfungen gel&ouml;scht und durch die neuen Verkn&uuml;pfungen ersetzt.<\/p>\n<p>Dabei erfolgt durch die Funktion <b>VerbindungHerstellen <\/b>der Aufruf einer <b>SELECT<\/b>-Anweisung auf der Zieldatenbank, wodurch die Zugangsdaten f&uuml;r diese Session gespeichert werden und solange g&uuml;ltig bleiben, sich der Benutzer die Access-Session beendet &#8211; und zwar durch Beenden von Access. Ein Schlie&szlig;en der Anwendung allein reicht nicht aus.<\/p>\n<p>Ist <b>VerbindungHerstellen <\/b>erfolgreich, werden durch die Prozedur <b>TabellenVerknuepfen <\/b>die Tabellen erneut verkn&uuml;pft. Nun wollen wir wissen, ob die Zugangsdaten tats&auml;chlich nicht in der Tabelle <b>MSysObjects <\/b>gespeichert wurden. Also &ouml;ffnen wir diese und finden das Resultat aus Bild 21 vor &#8211; die sensiblen Daten wurden also nicht gespeichert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_05\/pic_1156_0022.png\" alt=\"Pr&uuml;fung, ob Benutzername und Kennwort in der Tabelle MSysObjects gespeichert werden\" width=\"649,559\" height=\"142,6008\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Pr&uuml;fung, ob Benutzername und Kennwort in der Tabelle MSysObjects gespeichert werden<\/span><\/b><\/p>\n<h2>Anmelden ohne Neuverkn&uuml;pfen<\/h2>\n<p>K&ouml;nnen wir uns auch Anmelden, ohne die Verkn&uuml;pfungen erneut anzulegen Auch das ist m&ouml;glich. Dazu brauchen wir nur den Aufruf der Prozedur <b>TabellenVerknuepfen <\/b>in <b>cmdGo_Click <\/b>zu entfernen. Nach dem Einloggen des Benutzers k&ouml;nnen Sie problemlos auf die Tabellen der Datenbank <b>Suedsturm_SQL <\/b>zugreifen.<\/p>\n<h2>Zur Sicherheit: Zugriff ohne Anmeldung<\/h2>\n<p>Um sicherzugehen, dass wir nichts &uuml;bersehen, wollen wir auch noch einmal versuchen, nach dem erneuten &ouml;ffnen der Anwendung ohne Anmeldung auf die Tabellen zuzugreifen.<\/p>\n<p>Das Unerwartete geschah auf meinem Rechner: Ich konnte dennoch auf die Tabellen der SQL Server-Datenbank zugreifen. Was ist da passiert Wurden Benutzername und Kennwort nun doch an einer versteckten Stelle in der Datenbankdatei gespeichert Gibt es dadurch nun doch eine Sicherheitsl&uuml;cke<\/p>\n<p>Wenn Sie die Datenbank wie ich &uuml;ber das SQL-Skript aus dem Download angelegt und den Benutzer <b>Benutzer3 <\/b>angelegt haben, d&uuml;rften Sie das gleiche Ph&auml;nomen sehen.<\/p>\n<p>Aber was ist hier schiefgelaufen Um das herauszufinden, haben wir ein spezielles Tool des SQL Server Management Studio verwendet, n&auml;mlich die erweiterten Ereignisse.<\/p>\n<p>Dabei handelt es sich um den Nachfolger des SQL Server Profilers, mit dem man zuvor die Zugriffe auf eine SQL Server-Datenbank getrackt und untersucht hat.<\/p>\n<p>Wie wir die erweiterten Ereignisse im Detail eingesetzt haben, zeigen wir in einem weiteren Beitrag namens <b>SQL Server: Zugriffe untersuchen mit XEvents <\/b>(<b>www.access-im-unternehmen.de\/1158<\/b>).<\/p>\n<p>Des R&auml;tsels L&ouml;sung ist: Wir haben die Datenbank im Kontext des aktuell angemeldeten Windows-Benutzers erstellt, der somit gleichzeitig Besitzer dieser Datenbank ist &#8211; und mit universellen Berechtigungen auf alle Objekte der Datenbank ausgestattet.<\/p>\n<p>Wenn wir nun versuchen, auf die Datenbank zuzugreifen, ohne eine explizite SQL Server-Anmeldung zu verwenden, versucht der SQL Server offensichtlich, eine Anmeldung f&uuml;r den aktuellen Windows-Benutzer durchzuf&uuml;hren. Was auch geklappt hat, wie wir sehen &#8211; und wie wir im Beitrag <b>SQL Server: Zugriffe untersuchen mit erweiterten Ereignissen <\/b>nachweisen werden.<\/p>\n<p>Wenn Sie die Datenbank von einem anderen Benutzerkonto aus &ouml;ffnen, das keine Berechtigungen f&uuml;r die Datenbank (oder auch den SQL Server) besitzt, erscheint in diesem Falle eine Meldung, dass die Verbindung fehlgeschlagen ist und der Benutzer die Tabelle nicht &ouml;ffnen kann.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag hat gezeigt, wie Sie Verkn&uuml;pfungen auf die Tabellen eines SQL Servers per Assistent erstellen und welche Nachteile sich bei ihrer Verwendung ergeben &#8211; n&auml;mlich, dass beim ersten Zugriff auf eine Datenbank jeweils der systemeigene Dialog zum Eingeben der Zugangsdaten erscheint.<\/p>\n<p>Diesen wollen wir gleich beim Start einer Anwendung durch einen benutzerdefinierten Anmelde-Dialog ersetzen und bei dieser Gelegenheit gleich noch die Verkn&uuml;pfungen zu den Tabellen der SQL Server-Datenbank aktualisieren, was wir in diesem Beitrag gezeigt haben.<\/p>\n<p>Die letzte Aufgabe lag darin, herauszufinden, warum auf dem Rechner, auf dem die Datenbank erstellt wurde, ein Zugriff auf die Tabellen einer SQL Server-Datenbank ohne vorherige Anmeldung m&ouml;glich war. Wie Sie dies pr&uuml;fen, erfahren Sie im bereits erw&auml;hnten Beitrag <b>SQL Server: Zugriffe untersuchen mit XEvents<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SQLServerOhnePWD.accdb<\/p>\n<p>Suedsturm_SQL.sql<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/07CDE2CD-1F59-499B-B919-4376582149FC\/aiu_1156.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie per ODBC auf die Tabellen etwa eines SQL Servers zugreifen, kennen Sie das Dilemma: Entweder Sie nutzen die Windows-Authentifizierung, was nicht &uuml;berall m&ouml;glich ist, aber ohne gr&ouml;&szlig;ere Probleme funktioniert. Oder Sie verwenden die SQL Server-Authentifizierung. Dann haben Sie zwei M&ouml;glichkeiten: Entweder Sie erlauben das Speichern des Kennworts in den Systemtabellen von Access. Oder der Benutzer muss nach dem eigentlichen Anmelden nochmal seine Benutzerdaten eingeben, wenn der erste Zugriff auf eine Tabelle erfolgt. In dieser L&ouml;sung schauen wir uns diese Varianten an &#8211; und eine bessere, bei der Sie einfach die Tabellen beim Start neu verkn&uuml;pfen.<\/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":[662018,66052018,44000022],"tags":[],"class_list":["post-55001156","post","type-post","status-publish","format-standard","hentry","category-662018","category-66052018","category-SQL_Server_und_Co"],"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>SQL Server-Zugriff ohne gespeichertes Kennwort - 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\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server-Zugriff ohne gespeichertes Kennwort\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie per ODBC auf die Tabellen etwa eines SQL Servers zugreifen, kennen Sie das Dilemma: Entweder Sie nutzen die Windows-Authentifizierung, was nicht &uuml;berall m&ouml;glich ist, aber ohne gr&ouml;&szlig;ere Probleme funktioniert. Oder Sie verwenden die SQL Server-Authentifizierung. Dann haben Sie zwei M&ouml;glichkeiten: Entweder Sie erlauben das Speichern des Kennworts in den Systemtabellen von Access. Oder der Benutzer muss nach dem eigentlichen Anmelden nochmal seine Benutzerdaten eingeben, wenn der erste Zugriff auf eine Tabelle erfolgt. In dieser L&ouml;sung schauen wir uns diese Varianten an - und eine bessere, bei der Sie einfach die Tabellen beim Start neu verkn&uuml;pfen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:12:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"SQL Server-Zugriff ohne gespeichertes Kennwort\",\"datePublished\":\"2020-05-13T21:12:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/\"},\"wordCount\":3473,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2088298f08ba4298a8fb446e9febb014\",\"articleSection\":[\"2018\",\"5\\\/2018\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/\",\"name\":\"SQL Server-Zugriff ohne gespeichertes Kennwort - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2088298f08ba4298a8fb446e9febb014\",\"datePublished\":\"2020-05-13T21:12:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2088298f08ba4298a8fb446e9febb014\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2088298f08ba4298a8fb446e9febb014\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server-Zugriff ohne gespeichertes Kennwort\"}]},{\"@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":"SQL Server-Zugriff ohne gespeichertes Kennwort - 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\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/","og_locale":"de_DE","og_type":"article","og_title":"SQL Server-Zugriff ohne gespeichertes Kennwort","og_description":"Wenn Sie per ODBC auf die Tabellen etwa eines SQL Servers zugreifen, kennen Sie das Dilemma: Entweder Sie nutzen die Windows-Authentifizierung, was nicht &uuml;berall m&ouml;glich ist, aber ohne gr&ouml;&szlig;ere Probleme funktioniert. Oder Sie verwenden die SQL Server-Authentifizierung. Dann haben Sie zwei M&ouml;glichkeiten: Entweder Sie erlauben das Speichern des Kennworts in den Systemtabellen von Access. Oder der Benutzer muss nach dem eigentlichen Anmelden nochmal seine Benutzerdaten eingeben, wenn der erste Zugriff auf eine Tabelle erfolgt. In dieser L&ouml;sung schauen wir uns diese Varianten an - und eine bessere, bei der Sie einfach die Tabellen beim Start neu verkn&uuml;pfen.","og_url":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:12:25+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"SQL Server-Zugriff ohne gespeichertes Kennwort","datePublished":"2020-05-13T21:12:25+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/"},"wordCount":3473,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014","articleSection":["2018","5\/2018","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/","url":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/","name":"SQL Server-Zugriff ohne gespeichertes Kennwort - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014","datePublished":"2020-05-13T21:12:25+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/2088298f08ba4298a8fb446e9febb014"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/SQL_ServerZugriff_ohne_gespeichertes_Kennwort\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"SQL Server-Zugriff ohne gespeichertes Kennwort"}]},{"@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\/55001156","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=55001156"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001156\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}